Java Votary

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            48 隨筆 :: 1 文章 :: 80 評(píng)論 :: 0 Trackbacks
          面向方面的Annotation

          作者:Bill Burke,Enterprise JavaBeans 第四版合著者

          譯者:yahveyeye





          版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
          作者:Bill Burke;yahveyeye
          原文地址:http://www.onjava.com/pub/a/onjava/2004/08/25/aoa.html
          中文地址:http://www.matrix.org.cn/resource/article/44/44052_Annotation+Aop.html
          關(guān)鍵詞: Annotation Aop

          Annotation 是J2SE5.0的一項(xiàng)新功能,它允許您附加元數(shù)據(jù)到Java構(gòu)建中。同時(shí),面向方面編程(AOP)是一個(gè)相當(dāng)新的技術(shù),它可以使您封裝某些行為,這些行 為是在使用面向?qū)ο螅∣O)技術(shù)時(shí)會(huì)更為混亂,困難甚至是不可能完成。這兩項(xiàng)技術(shù)結(jié)合起來(lái)給框架開(kāi)發(fā)者開(kāi)發(fā)的APIs更好的表達(dá)方式。本文深入結(jié)合這些技 術(shù),使用Jboss AOP框架,以不同的代碼范例向您展示如何結(jié)合兩者來(lái)實(shí)際地?cái)U(kuò)展Java 語(yǔ)言。

          相關(guān)文章:
          Java Annotation入門(mén):
          http://www.matrix.org.cn/resource/article/44/44048_Java+Annotation.html

          Annotation概述

          首 先讓我們給出這兩項(xiàng)技術(shù)的一個(gè)概述。Annotation是JDK5.0的新功能,它在JSR-175規(guī)范中有詳細(xì)定義。它們?cè)试S您以安全的方法定義元數(shù) 據(jù)并應(yīng)用到類(lèi),方法,構(gòu)造程序,字段或參數(shù)中。對(duì)于你們中熟悉XDoclet的人來(lái)說(shuō),Annotation將非常直觀,您可以用來(lái)聲明標(biāo)簽以產(chǎn)生代碼。 兩者的主要不同是Annotation是Java語(yǔ)言的一部分而XDoclet標(biāo)簽可能會(huì)打錯(cuò)并且難以創(chuàng)建。我喜歡用例子來(lái)說(shuō)明,所以讓我們展示一個(gè)簡(jiǎn)單 的例子。

          要定義一個(gè)Annotation,您所要做的就是聲明一個(gè)特殊類(lèi)型的Java接口。

          清單1:Orange.java
          package org.jboss.collors;
          public @interface Orange{}


          定義了這個(gè)接口,您就可以用來(lái)提供更多的描述給您的Java元素。
          清單2:Foo.java
          package org.jboss.examples;
          public class Foo
          {
            @Orange void someMethod();
            @Orange private int someField;
          }


          那么我們可以用Annotation來(lái)干什么呢?一些人想用Annotation來(lái)產(chǎn)生代碼并替代XDoclet,其他人,象J2EE和EJB3.0專(zhuān)家組,將它視為部署描述符的替代。本文談?wù)撛贏OP中如何使用Annotation

          AOP概述

          有許多的文章和書(shū)籍解釋AOP到底是什么,例如Graham O'Regan的ONJava文章“Introduction to Aspect-Oriented Programming."我將在本文給出一個(gè)快速的概覽,但我鼓勵(lì)您在線(xiàn)做更多的研究。

          假設(shè)您要添加代碼到一個(gè)應(yīng)用程序去測(cè)試調(diào)用一個(gè)特定的java方法所需的總的時(shí)間。該代碼可能看起來(lái)如下:
          清單3:
          public class BankAccount
          {
          public void withdraw(double amount)
          {
          long startTime = System.currentTimeMillis();
          try
          {
          // Actual method body...
          }
          finally
          {
          long endTime = System.currentTimeMillis() - startTime;
          System.out.println("withdraw took: " + endTime);
          }
          }
          }


          雖然這些代碼能夠正常工作,但這個(gè)方法有一些問(wèn)題:
          1.它難以打開(kāi)和關(guān)閉測(cè)試,您必須在try/finally塊中對(duì)每個(gè)方法或購(gòu)置函數(shù)手工增加代碼以進(jìn)行基準(zhǔn)測(cè)試。
          2。這一輪廓代碼并不真正屬于貫穿整個(gè)應(yīng)用的代碼。它使得您的代碼臃腫并難以理解,因?yàn)槟仨殞⒂?jì)時(shí)放在try/finally塊中。
          3、如果您想擴(kuò)展它的功能以包含一個(gè)方法或是失敗計(jì)數(shù),或甚至是注冊(cè)這些統(tǒng)計(jì)數(shù)據(jù)到一個(gè)更為復(fù)雜的報(bào)告機(jī)制中,您必須修改大量不同文件(又一次)。

          Metrics 類(lèi)提供了一個(gè)什么是橫切(cross-cutting)關(guān)系的完美,簡(jiǎn)潔的小例子。Jboss AOP以一種含蓄的方式提供了一個(gè)簡(jiǎn)單的方法來(lái)封裝和應(yīng)用這樣的關(guān)系,這樣某些象度量操作代碼不會(huì)弄亂您的編碼。讓我們稍為深入到Jboss AOP一些來(lái)看看如何實(shí)現(xiàn)。
          為了使用Jboss AOP封裝度量功能,您首先需要定義一個(gè)方面來(lái)指出該度量行為。
          清單4:
          public class Metrics
          {
          public Object profile(MethodInvocation invocation) throws Throwable
          {
          long startTime = System.currentTimeMillis();
          try
          {
          return invocation.invokeNext();
          }
          finally
          {
          long endTime = System.currentTimeMillis() - startTime;
          java.lang.reflect.Method m = invocation.getMethod();
          System.out.println("method " + m.toString() +
          " time: " + endTime + "ms");
          } }
          }


          一 個(gè)方面只是一個(gè)具有定義了您想要附加到您的對(duì)象模型的行為的普通Java類(lèi)。這些方法的簽名必須返回一個(gè)java.lang.Object并且必須具有一 個(gè)(并且只有一個(gè))Jboss AOP 調(diào)用對(duì)象參數(shù),它被用來(lái)封裝方法,構(gòu)造函數(shù)或字段調(diào)用。方法名可以是任何你想要的并且當(dāng)您綁定該方面到您的代碼片斷時(shí)被引用。

          下面要做的事情就是實(shí)際應(yīng)用方面到您想要它勾勒一個(gè)方法的執(zhí)行的某個(gè)程序點(diǎn)。大多數(shù)AOP框架提供了一個(gè)指向表達(dá)式語(yǔ)言,在此處您可以定義您想要某個(gè)方面行為被附加到的位置。下面是在Jboss AOP中的做法。
          清單5:jboss-aop.xml
          <aop>
          <aspect class="Metrics"/>

          <bind pointcut="execution(public void BankAccount->withdraw(double amount))">
          <advice name="profile" aspect="Metrics"/>
          </bind>
          </aop>


          采用在Metrics.java中對(duì)方面的定義和jboss-aop.xml中的指向定義,該度量代碼現(xiàn)在以含蓄而又透明地應(yīng)用到BankAccount.withdraw()方法中并能在勾勒代碼不再需要時(shí)輕易地移除。
          對(duì)于Jboss AOP更多的信息,請(qǐng)查詢(xún)分發(fā)包中的指南。其中具有大約20個(gè)例子來(lái)帶領(lǐng)您漫游如何使用Jboss AOP框架。

          噓!現(xiàn)在我們已經(jīng)進(jìn)行了一個(gè)概覽,讓我們深入到本文的中心內(nèi)容。我將再次給您提供一些例子,因?yàn)檫@是我所知道的講授一個(gè)新的概念的最好的方法。
          正如我前面說(shuō)的,Annotation加上AOP幾乎是給予您擴(kuò)展Java語(yǔ)言的能力。Annotation提供了聲明新的,可兼容的,類(lèi)型安全的語(yǔ)法機(jī)制。AOP提供了封裝和應(yīng)用新的行為到一個(gè)語(yǔ)法表達(dá)式的機(jī)制。

          方法Annotation和AOP

          讓 我們看看如何使用方法Annotation和AOP。使用Annotation和AOP并應(yīng)用到一個(gè)方法類(lèi)似于使用Java的synchronized關(guān) 鍵字。當(dāng)您設(shè)定一個(gè)方法為synchronized,您在告訴JVM:您想該方法在被調(diào)用時(shí)以一種特殊的方式進(jìn)行。Annotation允許您定義一個(gè)新 的關(guān)鍵字來(lái)觸發(fā)您自己的特殊的定制行為。AOP給予您封裝這一行為的能力并將其“編織”進(jìn)該方法的執(zhí)行中。再次的,這一概念的最佳描述是通過(guò)一個(gè)例子。

          讓我們假設(shè)我們想要添加新的語(yǔ)法,使用該語(yǔ)法使得我們可以在方法被標(biāo)簽為@Oneway時(shí),在后臺(tái)以另一個(gè)線(xiàn)程調(diào)用這個(gè)void方法。可以象這樣使用新的語(yǔ)法:

          清單6:
          Import org.jboss.aspects.Oneway;
          public class Foo
          {
            @Oneway public static void someMethord(){…}
          public static void main(String[] args){
          somMethod();//executes in
          backgroud
          }
          }


          當(dāng)someMethod()在main中被調(diào)用,它將異步運(yùn)行,這樣main中的代碼可以并行執(zhí)行其他任務(wù)。
          要實(shí)現(xiàn)這一功能,首先要在一個(gè)Annotation中為我們的@Oneway標(biāo)簽定義新的Java語(yǔ)法.
          清單7:Oneway.java
          package org.jboss.aspects;

          import java.lang.annotation.ElementType;
          import java.lang.annotation.Target;

          @Target({ElementType.METHOD})
          public @interface Oneway {}


          夠簡(jiǎn)單的。@Target標(biāo)簽允許您縮小Annotation可以應(yīng)用的地方。在本例中,我們的@OnewayAnnotation只能應(yīng)用到一個(gè)方法。記住,這些都是J2SE5.0百分之百可用的純Java。
          下面要做的事是定義一個(gè)封裝我們的@Oneway行為的方面類(lèi)。
          清單8:OnewayAspect.java

          package org.jboss.aspects;

          public OnewayAspect
          {
          private static class Task implements Runnable
          {
          private MethodInvocation invocation;

          public Task(MethodInvocation invocation)
          {
          this.invocation = invocation;
          }
          public void run()
          {
          try { invocation.invokeNext(); }
          catch (Throwable ignore) { }
          }
          }


          public Object oneway(MethodInvocation invocation) throws Throwable
          {
          MethodInvocation copy = invocation.copy();
          Thread t = new Thread(new Task(copy));
          t.setDaemon(false);
          t.start();
          return null;
          }
          }


          這 個(gè)方面夠簡(jiǎn)單。oneway()方法拷貝invocation,創(chuàng)建一個(gè)線(xiàn)程,在后臺(tái)啟動(dòng)整個(gè)調(diào)用并返回。我們可以想象一個(gè)更為復(fù)雜的例子:使用J2SE 5.0 java.util.concurrent包中的某些新的Executors,但這些代碼很有希望闡明了如何基于這個(gè)例子構(gòu)建更為復(fù)雜的實(shí)現(xiàn)。
          最后必須要做的事情是指定當(dāng)@OnewayAnnotation在一個(gè)方法中聲明時(shí)觸發(fā)OnewayAspect應(yīng)用的指向表達(dá)式。

          清單9:jboss-aop.xml
          <aop>
          <aspect class="org.jboss.aspects.OnewayAspect"/>
          <bind pointcut="execution(void *->@org.jboss.Oneway(..))">
          <advice name="oneway"
          aspect="org.jboss.aspects.OnewayAspect"/>
          </bind>
          </aop>


          該 指向表達(dá)式規(guī)定任何具有@Oneway標(biāo)簽的void方法都應(yīng)該有OnewayAspect.oneway()方法在它本身執(zhí)行前被執(zhí)行。隨著 Annotation,方面和現(xiàn)在定義的指向表達(dá)式,@Oneway語(yǔ)法現(xiàn)在可以用于您的應(yīng)用程序中。一個(gè)簡(jiǎn)單,清晰,易于實(shí)現(xiàn)的方法來(lái)擴(kuò)展Java 語(yǔ)言!

          字段Annotation和AOP

          讓 我們看看如何使用字段Annotation和AOP。使用Annotation和AOP,您可以改變一個(gè)對(duì)象的字段或是作為一個(gè)類(lèi)的靜態(tài)成員的實(shí)際存儲(chǔ)方 式。在這個(gè)例子里我們要完成的是當(dāng)您將一個(gè)字段(靜態(tài)或是成員)標(biāo)記上@ThreadBased,盡管是將它存儲(chǔ)在 java.lang.ThreadLocal,但它的值依然正常。當(dāng)然,您可以直接使用ThreadLocal變量,但問(wèn)題是ThreadLocal并非 一個(gè)類(lèi)型并且您必須使用“麻煩的”(好,它們并沒(méi)有那么羅嗦)get()和set()方法。那么我們現(xiàn)在做的就是創(chuàng)建一個(gè)ThreadLocal類(lèi)型的字 段。我們主要的將創(chuàng)建一個(gè)稱(chēng)為@Thradbased變量的新的Java字段類(lèi)型。
          象這樣使用新的類(lèi)型:
          清單10:
          import org.jboss.aspects.Threadbased;
          public class Foo
          {
          @Threadbased private int counter;
          }


          為了實(shí)現(xiàn)這個(gè)功能,我們必須先定義Annotation
          清單11:Threadbased.java
          package org.jboss.aspects;
          import java.lang.annotation.ElementType;
          import java.lang.annotation.Target;
          @Target({ElementType.FIELD})
          public @interface Threadbased {}



          夠簡(jiǎn)單。@Target標(biāo)簽允許您縮小Annotation可以應(yīng)用的地方。在本例中,我們的@ThreadbasedAnnotation只能應(yīng)用到字段。
          下面的事情是定義封裝我們的ThreadLocal行為的方面。
          清單12:ThreadbasedAspect.java
          package org.jboss.aspects;
          import org.jboss.aop.joinpoint.*;
          import java.lang.reflect.Field;
          public class ThreadbasedAspect
          {
          private ThreadLocal threadbased = new ThreadLocal();
          public Object access(FieldReadInvocation invocation)
          throws Throwable
          {
          // just in case we have a primitive,
          // we can't return null
          if (threadbased.get() == null)
          return invocation.invokeNext();
          return threadbased.get();
          }
          public Object access(FieldWriteInvocation invocation)
          throws Throwable
          {
          threadbased.set(invocation.getValue());
          return null;
          }
          }


          ThreadbasedAspect 封裝到一個(gè)Java字段的訪問(wèn)。它里面具有一個(gè)專(zhuān)門(mén)的ThreadLocal變量跟蹤thradlocal變?yōu)橐粋€(gè)特殊的字段。它還有一個(gè)單獨(dú)的 access()方法,該方法根據(jù)一個(gè)字段的get或set方法是否被調(diào)用決定它是否被調(diào)用。這些方法委托給ThreadLocal來(lái)獲得字段的當(dāng)前值。
          最后,我們必須定義一個(gè)指向表達(dá)式,當(dāng)@ThreadbasedAnnotation在某個(gè)字段被指定時(shí)觸發(fā)ThreadbasedAspect的應(yīng)用。
          清單13:jboss-aop.xml
          <aop>
          <aspect class="org.jboss.aspects.ThreadbasedAspect" scope="PER_JOINPOINT"/>
          <bind pointcut="field(* *->@org.jboss.aspects.Threadbased)">
          <advice name="access"
          aspect="org.jboss.aspects.ThreadbasedAspect"/>
          </bind>
          </aop>


          只 有當(dāng)我們具有多個(gè)@Threadbased變量定義在同一個(gè)類(lèi)時(shí),我們需要為每個(gè)靜態(tài)字段分配一個(gè)ThreadbasedAspect實(shí)例。對(duì)于成員變 量,我們需要為每個(gè)字段,每個(gè)對(duì)象實(shí)例分配一個(gè)ThreadbasedAspect實(shí)例。為了促進(jìn)這一行為,方面定義通過(guò)設(shè)定實(shí)例為 PER_JOINPOINT限制方面類(lèi)的實(shí)例何時(shí)和何地被分配出去的范圍。如果我們不做限制,Jboss
          AOP會(huì)只分配一個(gè)ThreadbasedAspect實(shí)例并且不同的字段會(huì)共享相同的ThreadLocal接口——這不是我們所希望的。

          好就這樣。一個(gè)清晰容易的擴(kuò)展Java來(lái)指定一個(gè)新的特殊類(lèi)型的方法。注意:該特殊的方法來(lái)自Jboss AOP束。

          依賴(lài)注入

          字 段Annotation和AOP可以使用的一個(gè)有趣的地方是依賴(lài)注入。依賴(lài)注入是關(guān)于對(duì)象聲明它們需要什么信息,配置或服務(wù)引用以及運(yùn)行時(shí)自動(dòng)注入這些依 賴(lài)而不是用代碼明確地在一個(gè)注冊(cè)中心查找。在J2EE領(lǐng)域,獲得javax.transaction.TransactionManager服務(wù)的訪問(wèn)并 未標(biāo)準(zhǔn)化并且實(shí)際上不同的廠商有不同的實(shí)現(xiàn)。許多框架開(kāi)發(fā)者需要使用TransactionManager來(lái)實(shí)現(xiàn)定制事務(wù)服務(wù)。使用字段 AnnotationAOP提供依賴(lài)注入并抽取出一個(gè)需要TransactionManager的組件如何引用它的細(xì)節(jié)是一個(gè)了不起的方法。讓我們定義一 個(gè)方面,它將注入一個(gè)TransactionManager引用到一個(gè)字段值中。

          首先,我們?cè)俅味x我們的Annotation。

          清單14:Inject.java
          package org.jboss.aspects;
          import java.lang.annotation.ElementType;
          import java.lang.annotation.Target;
          @Target({ElementType.FIELD})
          public @interface Inject {}


          下面我們將定義方面類(lèi),它封裝了TransactionManager的解析。該方面是特定于JBoss應(yīng)用服務(wù)器,但您可以定義為每個(gè)廠商定義不同的實(shí)現(xiàn)。
          清單15:InjectTMAspect.java
          package org.jboss.aspects;
          import org.jboss.aop.joinpoint.*;
          import java.lang.reflect.Field;
          import javax.transaction.TransactionManager;
          import org.jboss.tm.TxManager;
          public InjectTMAspect
          {
          private TransactionManager tm = TxManager.getInstance();
          public Object access(FieldReadInvocation invocation)
          throws Throwable {
          return tm;
          }
          public Object access(FieldWriteInvocation invocation)
          throws Throwable {
          throw new RuntimeException(
          "Setting an @Injected variable is illegal");
          }
          }


          最后,我們必須定義XML綁定來(lái)觸發(fā)當(dāng)@Inject標(biāo)簽應(yīng)用到一個(gè)字段時(shí)InjectTMAspect的應(yīng)用。指向表達(dá)式基本上說(shuō)明了對(duì)任意一個(gè)標(biāo)記為@Inject的TransactionManager字段應(yīng)用InjectTMAspect。
          清單16:
          <aop>
          <aspect class="org.jboss.aspects.InjectTMAspect"/>
          <bind pointcut="field(javax.transaction.TransactionManager *->@org.jboss.aspects.Inject)">
          <advice name="access"
          aspect="org.jboss.aspects.InjectTMAspect"/>
          </bind>
          </aop>


          現(xiàn)在Annotation、方面類(lèi)和XML綁定已經(jīng)定義,我們可以在我們的代碼中使用了。
          清單17:
          import javax.transaction.TransactionManager;
          import org.jboss.aspects.Inject;
          public class MyTransactionalCache
          {
          @Inject private TransactionManager tm;
          ...
          }


          更多預(yù)打包例子

          Jboss AOP不僅僅是關(guān)于AOP框架。它還有一個(gè)豐富的方面庫(kù),您可以直接在您的應(yīng)用中使用。在這個(gè)庫(kù)中是一個(gè)比我們現(xiàn)在在本文展示的例子更為復(fù)雜的 Annotation方面集。這些方面包括異步調(diào)用,事務(wù)劃分,事務(wù)鎖定和基于角色的安全。讓我們簡(jiǎn)要地瀏覽一下以提供給您一個(gè)更好的關(guān)于 Annotation和AOP共同工作的考慮。

          異步方面
          Jboss AOP異步方面允許您定義任何方法為異步的,這樣它可以在后臺(tái)被執(zhí)行。這對(duì)于我們的@Oneway例子來(lái)說(shuō)有些困難,因?yàn)樗褂肙swego并行包中的執(zhí) 行器工具,并為那些具有一個(gè)返回類(lèi)型的方法提供了一個(gè)方法來(lái)異步地接收回響應(yīng)。要使用這個(gè)方面,您只需標(biāo)記一個(gè)方法為@Asybchronous.
          清單18:
          public Foo {
          @Asynchronous public int someMethod(int someArg) {...}
          }


          @Asynchronous 標(biāo)簽的應(yīng)用做了一些事情。與在本文中的@Oneway例子一樣,它應(yīng)用一個(gè)在后臺(tái)運(yùn)行該方法的方面。而且,采用@Asynchronous標(biāo)簽,您并不僅 限于void方法并可于實(shí)際上返回一個(gè)值的方法進(jìn)行交互。當(dāng)@Asynchronous標(biāo)簽被應(yīng)用,它強(qiáng)制Foo類(lèi)實(shí)現(xiàn) AsynchronousFacade接口。在AOP領(lǐng)域,這稱(chēng)為接口引入(interface introduction)。AsynchronousFacade接口允許您預(yù)測(cè)一個(gè)響應(yīng)或以超時(shí)限定等待一個(gè)響應(yīng)。最好用一個(gè)例子來(lái)解釋。
          清單19:
          Foo foo = new Foo();
          someMethod(555); // executes in background
          AsynchronousFacade facade = (AsynchronousFacade)foo;
          AsynchronousResponse response = facde.waitForResponse();
          System.out.println(response.getReturnValue());


          您可以啟動(dòng)多個(gè)不同對(duì)象的多個(gè)不同方法的多個(gè)調(diào)用,并異步積累它們的響應(yīng)。

          事務(wù)鎖定
          有時(shí)在J2EE事務(wù)期間而不是一個(gè)方法執(zhí)行,構(gòu)造函數(shù)調(diào)用或同步塊執(zhí)行期間同步一個(gè)對(duì)象或類(lèi)會(huì)很有用。對(duì)這類(lèi)事務(wù)同步或鎖定,Jboss AOP發(fā)明了@TxSynchronized關(guān)鍵字。您可以使用@TxSynchronized在任意成員或靜態(tài)方法已經(jīng)構(gòu)造函數(shù)上。
          清單20:
          import org.jboss.aspects.txlock.TxSynchronized;
          public FooBar
          {
          @TxSynchronized public FooBar() {}
          @TxSynchronized static void staticMethod() {}
          @TxSynchronized public memberMethod() {}
          }


          如 果一個(gè)被標(biāo)記為@TxSynchronized的構(gòu)造函數(shù)或靜態(tài)方法被調(diào)用,類(lèi)的鎖監(jiān)視器會(huì)在事務(wù)執(zhí)行期間被保持著。如果一個(gè)標(biāo)記為 @TxSynchronized的成員方法被調(diào)用,該對(duì)象實(shí)例的鎖監(jiān)視器將被保持直到目前的事務(wù)提交或回退。控制該行為的方面也將做死鎖檢測(cè)并在發(fā)生死鎖 時(shí)拋出RuntimeException。

          J2EE 散餐(原文法文:a la carte)之:事務(wù)劃分
          EJB3.0已經(jīng)定義了一些Annotation進(jìn)行事務(wù)劃分。Jboss AOP在此基礎(chǔ)上構(gòu)建。這樣您可以通過(guò)指定Annotation應(yīng)用事務(wù)劃分到任意方法(靜態(tài)或成員)以及任何Java類(lèi)構(gòu)造函數(shù)。
          清單21:
          import org.jboss.aspects.tx.*;
          public class Foo
          {
          @Tx(TxType.REQUIRED) public Foo {}
          @Tx(TxType.REQUIRESNEW) public static createFoo() {
          return new Foo();
          }
          }


          J2EE 散餐之:基于角色的安全
          EJB 3.0也定義了一些Annotation實(shí)現(xiàn)基于角色的安全。Jbos AOP是基于此構(gòu)建的,所以您可以應(yīng)用基于角色的安全到任何的字段或方法(靜態(tài)或成員)已經(jīng)構(gòu)造函數(shù)。
          清單22:
          import org.jboss.aspects.security.*;
          @SecurityDomain("LDAP Repository")
          public class Foo
          {
          @Permissions({"admin"}) public Foo() {}
          @Permissions({"developer"}) public static int status;
          @Permissions({"anybody"}) public static void doSomething() {...}
          }


          EJB演變

          隨 著AOP與EJB規(guī)范一起漸漸成熟,我真正希望發(fā)生的是EJB規(guī)范定義的Annotation將能在任何上下文作為新的Java語(yǔ)言的形容詞被使用,而不 是讓它們有限的使用在會(huì)話(huà)bean中。想象一下,一個(gè)真正的無(wú)狀態(tài)bean僅僅成為一個(gè)明文Java類(lèi)的一個(gè)靜態(tài)方法集。
          清單23:
          public MySessionBean
          {
          @Tx(TxType.REQUIRED) public static doSomething() {...}
          }


          無(wú)論如何,這些關(guān)于AOP和EJB的討論很可能就是為了EJB4.0。

          結(jié)論
          并非是限制J2SE5.0Annotation用于代碼生成,Annotation和AOP可以被結(jié)合起來(lái)提供新的能力給框架開(kāi)發(fā)者。這一結(jié)合允許開(kāi)發(fā)者定義新的具有行為附加到其上的Java語(yǔ)法。基本上,以安全的方式擴(kuò)展Java語(yǔ)言的能力已盡在掌握。

          資源
          ·Matrix-Java開(kāi)發(fā)者社區(qū):http://www.matrix.org.cn
          ·onjava.com:onjava.com

          關(guān)于作者
          Bill Burke :JBoss 首席架構(gòu)師.
          posted on 2005-12-15 13:12 Dion 閱讀(1628) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java
          主站蜘蛛池模板: 南木林县| 洛浦县| 崇仁县| 浏阳市| 晋州市| 昌邑市| 琼海市| 隆德县| 家居| 青龙| 龙陵县| 永登县| 太湖县| 都匀市| 陈巴尔虎旗| 虎林市| 扎囊县| 德惠市| 百色市| 乌苏市| 南陵县| 萨嘎县| 神池县| 衡山县| 梓潼县| 陕西省| 台北县| 永清县| 包头市| 吴江市| 安徽省| 方城县| 弋阳县| 江都市| 永济市| 清水县| 仪陇县| 慈溪市| 苏尼特左旗| 都安| 自贡市|