this is a extra element for clear the floated element
ÃæÏò·½Ãæ±à³ÌµÄAnnotation¼ò½é
  • 12/31
  • 2008
J2eeºËÐÄ | Java 1190 ´Î²é¿´
¡¡¡¡



¡¡¡¡Annotation¸ÅÊö


¡¡¡¡



¡¡¡¡



¡¡¡¡Ê×ÏÈÈÃÎÒÃǸø³öÕâÁ½Ïî¼¼ÊõµÄÒ»¸ö¸ÅÊö¡£AnnotationÊÇJDK5.0µÄй¦ÄÜ£¬ËüÔÚJSR-175¹æ·¶ÖÐÓÐÏêϸ¶¨Òå¡£ËüÃÇÔÊÐíÄúÒÔ°²È«µÄ·½·¨¶¨ÒåÔªÊý¾Ý²¢Ó¦Óõ½À࣬·½·¨£¬¹¹Ôì³ÌÐò£¬×ֶλò²ÎÊýÖС£¶ÔÓÚÄãÃÇÖÐÊìϤXDocletµÄÈËÀ´Ëµ£¬Annotation½«·Ç³£Ö±¹Û£¬Äú¿ÉÒÔÓÃÀ´ÉùÃ÷±êÇ©ÒÔ²úÉú´úÂë¡£Á½ÕßµÄÖ÷Òª²»Í¬ÊÇAnnotationÊÇJavaÓïÑÔµÄÒ»²¿·Ö¶øXDoclet±êÇ©¿ÉÄÜ»á´ò´í²¢ÇÒÄÑÒÔ´´½¨¡£ÎÒϲ»¶ÓÃÀý×ÓÀ´ËµÃ÷£¬ËùÒÔÈÃÎÒÃÇչʾһ¸ö¼òµ¥µÄÀý×Ó¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Òª¶¨ÒåÒ»¸öAnnotation£¬ÄúËùÒª×öµÄ¾ÍÊÇÉùÃ÷Ò»¸öÌØÊâÀàÐ͵ÄJava½Ó¿Ú¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥1£º
Orange.java

¡¡¡¡
package org.jboss.collors;

¡¡¡¡public @interface Orange{}


¡¡¡¡



¡¡¡¡

¡¡¡¡¶¨ÒåÁËÕâ¸ö½Ó¿Ú£¬Äú¾Í¿ÉÒÔÓÃÀ´Ìṩ¸ü¶àµÄÃèÊö¸øÄúµÄJavaÔªËØ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥2£ºFoo.java


¡¡¡¡



¡¡¡¡package org.jboss.examples;

¡¡¡¡public class Foo

¡¡¡¡{

¡¡¡¡@Orange void someMethod();

¡¡¡¡@Orange private int someField;

¡¡¡¡}


¡¡¡¡



¡¡¡¡

¡¡¡¡ÄÇôÎÒÃÇ¿ÉÒÔÓÃAnnotationÀ´¸ÉÊ²Ã´ÄØ£¿Ò»Ð©ÈËÏëÓÃAnnotationÀ´²úÉú´úÂë²¢Ìæ´úXDoclet£¬ÆäËûÈË£¬ÏóJ2EEºÍEJB3.0ר¼Ò×飬½«ËüÊÓΪ²¿ÊðÃèÊö·ûµÄÌæ´ú¡£±¾ÎÄ̸ÂÛÔÚAOPÖÐÈçºÎʹÓÃAnnotation


¡¡¡¡



¡¡¡¡



¡¡¡¡AOP¸ÅÊö


¡¡¡¡



¡¡¡¡



¡¡¡¡ÓÐÐí¶àµÄÎÄÕºÍÊé¼®½âÊÍAOPµ½µ×ÊÇʲô£¬ÀýÈçGraham O'ReganµÄONJavaÎÄÕ¡°Introduction to Aspect-Oriented Programming."ÎÒ½«ÔÚ±¾Îĸø³öÒ»¸ö¿ìËٵĸÅÀÀ£¬µ«ÎÒ¹ÄÀøÄúÔÚÏß×ö¸ü¶àµÄÑо¿¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡¼ÙÉèÄúÒªÌí¼Ó´úÂëµ½Ò»¸öÓ¦ÓóÌÐòÈ¥²âÊÔµ÷ÓÃÒ»¸öÌØ¶¨µÄjava·½·¨ËùÐèµÄ×ܵÄʱ¼ä¡£¸Ã´úÂë¿ÉÄÜ¿´ÆðÀ´ÈçÏ£º


¡¡¡¡



¡¡¡¡

Çåµ¥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);

¡¡¡¡}

¡¡¡¡}

¡¡¡¡}


¡¡¡¡



¡¡¡¡

¡¡¡¡ËäÈ»ÕâЩ´úÂëÄܹ»Õý³£¹¤×÷£¬µ«Õâ¸ö·½·¨ÓÐһЩÎÊÌ⣺1.ËüÄÑÒÔ´ò¿ªºÍ¹Ø±Õ²âÊÔ£¬Äú±ØÐëÔÚtry/finally¿éÖжÔÿ¸ö·½·¨»ò¹ºÖú¯ÊýÊÖ¹¤Ôö¼Ó´úÂëÒÔ½øÐлù×¼²âÊÔ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡2.ÕâÒ»ÂÖÀª´úÂë²¢²»ÕæÕýÊôÓڹᴩÕû¸öÓ¦ÓõĴúÂë¡£ËüʹµÃÄúµÄ´úÂëÓ·Öײ¢ÄÑÒÔÀí½â£¬ÒòΪÄú±ØÐ뽫¼ÆÊ±·ÅÔÚtry/finally¿éÖС£


¡¡¡¡



¡¡¡¡



¡¡¡¡3¡¢Èç¹ûÄúÏëÀ©Õ¹ËüµÄ¹¦ÄÜÒÔ°üº¬Ò»¸ö·½·¨»òÊÇʧ°Ü¼ÆÊý£¬»òÉõÖÁÊÇ×¢²áÕâЩͳ¼ÆÊý¾Ýµ½Ò»¸ö¸üΪ¸´Ôӵı¨¸æ»úÖÆÖУ¬Äú±ØÐëÐ޸ĴóÁ¿²»Í¬Îļþ£¨ÓÖÒ»´Î£©¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡MetricsÀàÌṩÁËÒ»¸öʲôÊǺáÇУ¨cross-cutting£©¹ØÏµµÄÍêÃÀ£¬¼ò½àµÄСÀý×Ó¡£Jboss AOPÒÔÒ»ÖÖº¬ÐîµÄ·½Ê½ÌṩÁËÒ»¸ö¼òµ¥µÄ·½·¨À´·â×°ºÍÓ¦ÓÃÕâÑùµÄ¹ØÏµ£¬ÕâÑùijЩÏó¶ÈÁ¿²Ù×÷´úÂë²»»áŪÂÒÄúµÄ±àÂë¡£ÈÃÎÒÃÇÉÔΪÉîÈëµ½Jboss AOPһЩÀ´¿´¿´ÈçºÎʵÏÖ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÎªÁËʹÓÃJboss AOP·â×°¶ÈÁ¿¹¦ÄÜ£¬ÄúÊ×ÏÈÐèÒª¶¨ÒåÒ»¸ö·½ÃæÀ´Ö¸³ö¸Ã¶ÈÁ¿ÐÐΪ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥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");

¡¡¡¡} }

¡¡¡¡}


¡¡¡¡



¡¡¡¡

¡¡¡¡Ò»¸ö·½ÃæÖ»ÊÇÒ»¸ö¾ßÓж¨ÒåÁËÄúÏëÒª¸½¼Óµ½ÄúµÄ¶ÔÏóÄ£Ð͵ÄÐÐΪµÄÆÕͨJavaÀà¡£ÕâЩ·½·¨µÄÇ©Ãû±ØÐë·µ»ØÒ»¸öjava.lang.Object²¢ÇÒ±ØÐë¾ßÓÐÒ»¸ö£¨²¢ÇÒÖ»ÓÐÒ»¸ö£©Jboss AOP µ÷ÓöÔÏó²ÎÊý£¬Ëü±»ÓÃÀ´·â×°·½·¨£¬¹¹Ô캯Êý»ò×ֶε÷Ó᣷½·¨Ãû¿ÉÒÔÊÇÈκÎÄãÏëÒªµÄ²¢ÇÒµ±Äú°ó¶¨¸Ã·½Ãæµ½ÄúµÄ´úÂëÆ¬¶Ïʱ±»ÒýÓá£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÏÂÃæÒª×öµÄÊÂÇé¾ÍÊÇʵ¼ÊÓ¦Ó÷½Ãæµ½ÄúÏëÒªËü¹´ÀÕÒ»¸ö·½·¨µÄÖ´ÐеÄij¸ö³ÌÐòµã¡£´ó¶àÊýAOP¿ò¼ÜÌṩÁËÒ»¸öÖ¸Ïò±í´ïʽÓïÑÔ£¬ÔÚ´Ë´¦Äú¿ÉÒÔ¶¨ÒåÄúÏëҪij¸ö·½ÃæÐÐΪ±»¸½¼Óµ½µÄλÖá£ÏÂÃæÊÇÔÚ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ÖжԷ½ÃæµÄ¶¨ÒåºÍjboss-aop.xmlÖеÄÖ¸Ïò¶¨Ò壬¸Ã¶ÈÁ¿´úÂëÏÖÔÚÒÔº¬Ðî¶øÓÖ͸Ã÷µØÓ¦Óõ½BankAccount.withdraw£¨£©·½·¨Öв¢ÄÜÔÚ¹´ÀÕ´úÂë²»ÔÙÐèҪʱÇáÒ×µØÒƳý¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡¶ÔÓÚJboss AOP¸ü¶àµÄÐÅÏ¢£¬Çë²éѯ·Ö·¢°üÖеÄÖ¸ÄÏ¡£ÆäÖоßÓдóÔ¼20¸öÀý×ÓÀ´´øÁìÄúÂþÓÎÈçºÎʹÓÃJboss AOP¿ò¼Ü¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Ð꣡ÏÖÔÚÎÒÃÇÒѾ­½øÐÐÁËÒ»¸ö¸ÅÀÀ£¬ÈÃÎÒÃÇÉîÈëµ½±¾ÎĵÄÖÐÐÄÄÚÈÝ¡£ÎÒ½«ÔٴθøÄúÌṩһЩÀý×Ó£¬ÒòΪÕâÊÇÎÒËùÖªµÀµÄ½²ÊÚÒ»¸öеĸÅÄîµÄ×îºÃµÄ·½·¨¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÕýÈçÎÒÇ°ÃæËµµÄ£¬Annotation¼ÓÉÏAOP¼¸ºõÊǸøÓèÄúÀ©Õ¹JavaÓïÑÔµÄÄÜÁ¦¡£AnnotationÌṩÁËÉùÃ÷Ðµģ¬¿É¼æÈݵģ¬ÀàÐͰ²È«µÄÓï·¨»úÖÆ¡£AOPÌṩÁË·â×°ºÍÓ¦ÓÃеÄÐÐΪµ½Ò»¸öÓï·¨±í´ïʽµÄ»úÖÆ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡·½·¨AnnotationºÍAOP


¡¡¡¡



¡¡¡¡



¡¡¡¡ÈÃÎÒÃÇ¿´¿´ÈçºÎʹÓ÷½·¨AnnotationºÍAOP.ʹÓÃAnnotationºÍAOP²¢Ó¦Óõ½Ò»¸ö·½·¨ÀàËÆÓÚʹÓÃJavaµÄsynchronized¹Ø¼ü×Ö¡£µ±ÄúÉ趨һ¸ö·½·¨Îªsynchronized£¬ÄúÔÚ¸æËßJVM£ºÄúÏë¸Ã·½·¨ÔÚ±»µ÷ÓÃʱÒÔÒ»ÖÖÌØÊâµÄ·½Ê½½øÐС£AnnotationÔÊÐíÄú¶¨ÒåÒ»¸öеĹؼü×ÖÀ´´¥·¢Äú×Ô¼ºµÄÌØÊâµÄ¶¨ÖÆÐÐΪ¡£AOP¸øÓèÄú·â×°ÕâÒ»ÐÐΪµÄÄÜÁ¦²¢½«Æä¡°±àÖ¯¡±½ø¸Ã·½·¨µÄÖ´ÐÐÖС£Ôٴεģ¬ÕâÒ»¸ÅÄîµÄ×î¼ÑÃèÊöÊÇͨ¹ýÒ»¸öÀý×Ó¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÈÃÎÒÃǼÙÉèÎÒÃÇÏëÒªÌí¼ÓеÄÓï·¨£¬Ê¹ÓøÃÓ﷨ʹµÃÎÒÃÇ¿ÉÒÔÔÚ·½·¨±»±êǩΪ@Onewayʱ£¬ÔÚºǫ́ÒÔÁíÒ»¸öÏ̵߳÷ÓÃÕâ¸övoid·½·¨¡£¿ÉÒÔÏóÕâÑùʹÓÃеÄÓï·¨£º


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥6£º


¡¡¡¡



¡¡¡¡Import org.jboss.aspects.Oneway£»

¡¡¡¡public class Foo

¡¡¡¡{

¡¡¡¡@Oneway public static void someMethord
£¨£©{¡­}

¡¡¡¡public static void main(String[] args){

¡¡¡¡somMethod();//executes in

¡¡¡¡backgroud

¡¡¡¡}

¡¡¡¡}


¡¡¡¡



¡¡¡¡

¡¡¡¡µ±someMethod£¨£©ÔÚmainÖб»µ÷Óã¬Ëü½«Òì²½ÔËÐУ¬ÕâÑùmainÖеĴúÂë¿ÉÒÔ²¢ÐÐÖ´ÐÐÆäËûÈÎÎñ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÒªÊµÏÖÕâÒ»¹¦ÄÜ£¬Ê×ÏÈÒªÔÚÒ»¸öAnnotationÖÐΪÎÒÃǵÄ@Oneway±êÇ©¶¨ÒåеÄJavaÓï·¨¡£


¡¡¡¡



¡¡¡¡

Çåµ¥7£ºOneway.java

¡¡¡¡



¡¡¡¡

package org.jboss.aspects;

¡¡¡¡

¡¡¡¡import java.lang.annotation.ElementType;

¡¡¡¡import java.lang.annotation.Target;

¡¡¡¡

¡¡¡¡@Target({ElementType.METHOD})

¡¡¡¡public @interface Oneway {}


¡¡¡¡



¡¡¡¡

¹»¼òµ¥µÄ¡£@Target±êÇ©ÔÊÐíÄúËõСAnnotation¿ÉÒÔÓ¦Óõĵط½¡£ÔÚ±¾ÀýÖУ¬ÎÒÃǵÄ@OnewayAnnotationÖ»ÄÜÓ¦Óõ½Ò»¸ö·½·¨¡£¼Çס£¬ÕâЩ¶¼ÊÇJ2SE5.0°Ù·ÖÖ®°Ù¿ÉÓõĴ¿Java¡£

¡¡¡¡



¡¡¡¡

ÏÂÃæÒª×öµÄÊÂÊǶ¨ÒåÒ»¸ö·â×°ÎÒÃǵÄ@OnewayÐÐΪµÄ·½ÃæÀà¡£

¡¡¡¡



¡¡¡¡

Çåµ¥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;

¡¡¡¡}

¡¡¡¡}


¡¡¡¡



¡¡¡¡



¡¡¡¡Õâ¸ö·½Ãæ¹»¼òµ¥¡£oneway£¨£©·½·¨¿½±´invocation£¬´´½¨Ò»¸öỊ̈߳¬ÔÚºǫ́Æô¶¯Õû¸öµ÷Óò¢·µ»Ø¡£ÎÒÃÇ¿ÉÒÔÏëÏóÒ»¸ö¸üΪ¸´ÔÓµÄÀý×Ó£ºÊ¹ÓÃJ2SE 5.0 java.util.concurrent°üÖеÄijЩеÄExecutors£¬µ«ÕâЩ´úÂëºÜÓÐÏ£Íû²ûÃ÷ÁËÈçºÎ»ùÓÚÕâ¸öÀý×Ó¹¹½¨¸üΪ¸´ÔÓµÄʵÏÖ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡×îºó±ØÐëÒª×öµÄÊÂÇéÊÇÖ¸¶¨µ±@OnewayAnnotationÔÚÒ»¸ö·½·¨ÖÐÉùÃ÷ʱ´¥·¢OnewayAspectÓ¦ÓõÄÖ¸Ïò±í´ïʽ¡£


¡¡¡¡



¡¡¡¡

Çåµ¥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>


¡¡¡¡



¡¡¡¡



¡¡¡¡¸ÃÖ¸Ïò±í´ïʽ¹æ¶¨ÈκξßÓÐ@Oneway±êÇ©µÄvoid·½·¨¶¼Ó¦¸ÃÓÐOnewayAspect.oneway£¨£©·½·¨ÔÚËü±¾ÉíÖ´ÐÐǰ±»Ö´ÐС£Ëæ×ÅAnnotation£¬·½ÃæºÍÏÖÔÚ¶¨ÒåµÄÖ¸Ïò±í´ïʽ£¬@OnewayÓï·¨ÏÖÔÚ¿ÉÒÔÓÃÓÚÄúµÄÓ¦ÓóÌÐòÖС£Ò»¸ö¼òµ¥£¬ÇåÎú£¬Ò×ÓÚʵÏֵķ½·¨À´À©Õ¹Java ÓïÑÔ£¡


¡¡¡¡



¡¡¡¡



¡¡¡¡×Ö¶ÎAnnotationºÍAOP


¡¡¡¡



¡¡¡¡



¡¡¡¡ÈÃÎÒÃÇ¿´¿´ÈçºÎʹÓÃ×Ö¶ÎAnnotationºÍAOP.ʹÓÃAnnotationºÍAOP£¬Äú¿ÉÒԸıäÒ»¸ö¶ÔÏóµÄ×ֶλòÊÇ×÷Ϊһ¸öÀàµÄ¾²Ì¬³ÉÔ±µÄʵ¼Ê´æ´¢·½Ê½¡£ÔÚÕâ¸öÀý×ÓÀïÎÒÃÇÒªÍê³ÉµÄÊǵ±Äú½«Ò»¸ö×ֶΣ¨¾²Ì¬»òÊdzÉÔ±£©±ê¼ÇÉÏ@ThreadBased£¬¾¡¹ÜÊǽ«Ëü´æ´¢ÔÚjava.lang.ThreadLocal£¬µ«ËüµÄÖµÒÀÈ»Õý³£¡£µ±È»£¬Äú¿ÉÒÔÖ±½ÓʹÓÃThreadLocal±äÁ¿£¬µ«ÎÊÌâÊÇThreadLocal²¢·ÇÒ»¸öÀàÐͲ¢ÇÒÄú±ØÐëʹÓá°Âé·³µÄ¡±£¨ºÃ£¬ËüÃDz¢Ã»ÓÐÄÇôÂÞࣩget£¨£©ºÍset£¨£©·½·¨¡£ÄÇôÎÒÃÇÏÖÔÚ×öµÄ¾ÍÊÇ´´½¨Ò»¸öThreadLocalÀàÐ͵Ä×ֶΡ£ÎÒÃÇÖ÷ÒªµÄ½«´´½¨Ò»¸ö³ÆÎª@Thradbased±äÁ¿µÄеÄJava×Ö¶ÎÀàÐÍ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÏóÕâÑùʹÓÃеÄÀàÐÍ£º


¡¡¡¡



¡¡¡¡

Çåµ¥10£º

¡¡¡¡



¡¡¡¡

import org.jboss.aspects.Threadbased;

¡¡¡¡public class Foo

¡¡¡¡{

¡¡¡¡@Threadbased private int counter;

¡¡¡¡}


¡¡¡¡



¡¡¡¡ÎªÁËʵÏÖÕâ¸ö¹¦ÄÜ£¬ÎÒÃDZØÐëÏȶ¨ÒåAnnotation


¡¡¡¡



¡¡¡¡

Çåµ¥11£ºThreadbased.java

¡¡¡¡



¡¡¡¡

package org.jboss.aspects;

¡¡¡¡import java.lang.annotation.ElementType;

¡¡¡¡import java.lang.annotation.Target;

¡¡¡¡@Target({ElementType.FIELD})

¡¡¡¡public @interface Threadbased {}


¡¡¡¡



¡¡¡¡



¡¡¡¡¹»¼òµ¥¡£@Target±êÇ©ÔÊÐíÄúËõСAnnotation¿ÉÒÔÓ¦Óõĵط½¡£ÔÚ±¾ÀýÖУ¬ÎÒÃǵÄ@ThreadbasedAnnotationÖ»ÄÜÓ¦Óõ½×ֶΡ£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÏÂÃæµÄÊÂÇéÊǶ¨Òå·â×°ÎÒÃǵÄ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 ·â×°µ½Ò»¸öJava×ֶεķÃÎÊ¡£ËüÀïÃæ¾ßÓÐÒ»¸öרÃŵÄThreadLocal±äÁ¿¸ú×Ùthradlocal±äΪһ¸öÌØÊâµÄ×ֶΡ£Ëü»¹ÓÐÒ»¸öµ¥¶ÀµÄaccess£¨£©·½·¨£¬¸Ã·½·¨¸ù¾ÝÒ»¸ö×ֶεÄget»òset·½·¨ÊÇ·ñ±»µ÷Óþö¶¨ËüÊÇ·ñ±»µ÷Óá£ÕâЩ·½·¨Î¯ÍиøThreadLocalÀ´»ñµÃ×ֶεĵ±Ç°Öµ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡×îºó£¬ÎÒÃDZØÐ붨ÒåÒ»¸öÖ¸Ïò±í´ïʽ£¬µ±@ThreadbasedAnnotationÔÚij¸ö×ֶα»Ö¸¶¨Ê±´¥·¢ThreadbasedAspectµÄÓ¦Óá£


¡¡¡¡



¡¡¡¡

Çåµ¥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>


¡¡¡¡



¡¡¡¡



¡¡¡¡Ö»Óе±ÎÒÃǾßÓжà¸ö@Threadbased±äÁ¿¶¨ÒåÔÚͬһ¸öÀàʱ£¬ÎÒÃÇÐèҪΪÿ¸ö¾²Ì¬×ֶηÖÅäÒ»¸öThreadbasedAspectʵÀý¡£¶ÔÓÚ³ÉÔ±±äÁ¿£¬ÎÒÃÇÐèҪΪÿ¸ö×ֶΣ¬Ã¿¸ö¶ÔÏóʵÀý·ÖÅäÒ»¸öThreadbasedAspectʵÀý¡£ÎªÁË´Ù½øÕâÒ»ÐÐΪ£¬·½Ã涨Òåͨ¹ýÉ趨ʵÀýΪPER_JOINPOINTÏÞÖÆ·½ÃæÀàµÄʵÀýºÎʱºÍºÎµØ±»·ÖÅä³öÈ¥µÄ·¶Î§¡£Èç¹ûÎÒÃDz»×öÏÞÖÆ£¬Jboss


¡¡¡¡



¡¡¡¡



¡¡¡¡AOP»áÖ»·ÖÅäÒ»¸öThreadbasedAspectʵÀý²¢ÇÒ²»Í¬µÄ×ֶλṲÏíÏàͬµÄThreadLocal½Ó¿Ú¨D¨DÕâ²»ÊÇÎÒÃÇËùÏ£ÍûµÄ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ºÃ¾ÍÕâÑù¡£Ò»¸öÇåÎúÈÝÒ×µÄÀ©Õ¹JavaÀ´Ö¸¶¨Ò»¸öеÄÌØÊâÀàÐ͵ķ½·¨¡£×¢Ò⣺¸ÃÌØÊâµÄ·½·¨À´×ÔJboss AOPÊø¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÒÀÀµ×¢Èë


¡¡¡¡



¡¡¡¡



¡¡¡¡×Ö¶ÎAnnotationºÍAOP¿ÉÒÔʹÓõÄÒ»¸öÓÐȤµÄµØ·½ÊÇÒÀÀµ×¢Èë¡£ÒÀÀµ×¢ÈëÊǹØÓÚ¶ÔÏóÉùÃ÷ËüÃÇÐèҪʲôÐÅÏ¢£¬ÅäÖûò·þÎñÒýÓÃÒÔ¼°ÔËÐÐʱ×Ô¶¯×¢ÈëÕâЩÒÀÀµ¶ø²»ÊÇÓôúÂëÃ÷È·µØÔÚÒ»¸ö×¢²áÖÐÐIJéÕÒ¡£ÔÚJ2EEÁìÓò£¬»ñµÃjavax.transaction.TransactionManager·þÎñµÄ·ÃÎʲ¢Î´±ê×¼»¯²¢ÇÒʵ¼ÊÉϲ»Í¬µÄ³§ÉÌÓв»Í¬µÄʵÏÖ¡£Ðí¶à¿ò¼Ü¿ª·¢ÕßÐèҪʹÓÃTransactionManagerÀ´ÊµÏÖ¶¨ÖÆÊÂÎñ·þÎñ¡£Ê¹ÓÃ×Ö¶ÎAnnotationAOPÌṩÒÀÀµ×¢Èë²¢³éÈ¡³öÒ»¸öÐèÒªTransactionManagerµÄ×é¼þÈçºÎÒýÓÃËüµÄϸ½ÚÊÇÒ»¸öÁ˲»ÆðµÄ·½·¨¡£ÈÃÎÒÃǶ¨ÒåÒ»¸ö·½Ã棬Ëü½«×¢ÈëÒ»¸öTransactionManagerÒýÓõ½Ò»¸ö×Ö¶ÎÖµÖС£


¡¡¡¡



¡¡¡¡



¡¡¡¡Ê×ÏÈ£¬ÎÒÃÇÔٴζ¨ÒåÎÒÃǵÄAnnotation.


¡¡¡¡

Çåµ¥14£ºInject.java

¡¡¡¡



¡¡¡¡

package org.jboss.aspects;

¡¡¡¡import java.lang.annotation.ElementType;

¡¡¡¡import java.lang.annotation.Target;

¡¡¡¡@Target({ElementType.FIELD})

¡¡¡¡public @interface Inject {}


¡¡¡¡



¡¡¡¡



¡¡¡¡ÏÂÃæÎÒÃǽ«¶¨Òå·½ÃæÀ࣬Ëü·â×°ÁË
TransactionManagerµÄ½âÎö¡£¸Ã·½ÃæÊÇÌØ¶¨ÓÚJBossÓ¦Ó÷þÎñÆ÷£¬µ«Äú¿ÉÒÔ¶¨ÒåΪÿ¸ö³§É̶¨Ò岻ͬµÄʵÏÖ¡£

¡¡¡¡



¡¡¡¡

Çåµ¥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");

¡¡¡¡}

¡¡¡¡}


¡¡¡¡





¡¡¡¡



¡¡¡¡×îºó£¬ÎÒÃDZØÐ붨ÒåXML°ó¶¨À´´¥·¢µ±@Inject±êǩӦÓõ½Ò»¸ö×Ö¶ÎʱInjectTMAspectµÄÓ¦Óá£Ö¸Ïò±í´ïʽ»ù±¾ÉÏ˵Ã÷Á˶ÔÈÎÒâÒ»¸ö±ê¼ÇΪ@InjectµÄTransactionManager×Ö¶ÎÓ¦ÓÃ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>


¡¡¡¡



¡¡¡¡



¡¡¡¡ÏÖÔÚAnnotation¡¢·½ÃæÀàºÍXML°ó¶¨ÒѾ­¶¨Ò壬ÎÒÃÇ¿ÉÒÔÔÚÎÒÃǵĴúÂëÖÐʹÓÃÁË¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥17£º


¡¡¡¡



¡¡¡¡

import javax.transaction.TransactionManager;

¡¡¡¡import org.jboss.aspects.Inject;

¡¡¡¡public class MyTransactionalCache

¡¡¡¡{

¡¡¡¡@Inject private TransactionManager tm;

¡¡¡¡...

¡¡¡¡}


¡¡¡¡



¡¡¡¡¸ü¶àÔ¤´ò°üÀý×Ó


¡¡¡¡



¡¡¡¡



¡¡¡¡Jboss AOP²»½ö½öÊǹØÓÚAOP¿ò¼Ü¡£Ëü»¹ÓÐÒ»¸ö·á¸»µÄ·½Ãæ¿â£¬Äú¿ÉÒÔÖ±½ÓÔÚÄúµÄÓ¦ÓÃÖÐʹÓá£ÔÚÕâ¸ö¿âÖÐÊÇÒ»¸ö±ÈÎÒÃÇÏÖÔÚÔÚ±¾ÎÄչʾµÄÀý×Ó¸üΪ¸´ÔÓµÄAnnotation·½Ã漯¡£ÕâЩ·½Ãæ°üÀ¨Òì²½µ÷Óã¬ÊÂÎñ»®·Ö£¬ÊÂÎñËø¶¨ºÍ»ùÓÚ½ÇÉ«µÄ°²È«¡£ÈÃÎÒÃǼòÒªµØä¯ÀÀÒ»ÏÂÒÔÌṩ¸øÄúÒ»¸ö¸üºÃµÄ¹ØÓÚAnnotationºÍAOP¹²Í¬¹¤×÷µÄ¿¼ÂÇ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Òì²½·½Ãæ


¡¡¡¡



¡¡¡¡



¡¡¡¡Jboss AOPÒì²½·½ÃæÔÊÐíÄú¶¨ÒåÈκη½·¨ÎªÒì²½µÄ£¬ÕâÑùËü¿ÉÒÔÔÚºǫ́±»Ö´ÐС£Õâ¶ÔÓÚÎÒÃǵÄ@OnewayÀý×ÓÀ´ËµÓÐЩÀ§ÄÑ£¬ÒòΪËüʹÓÃOswego²¢ÐаüÖеÄÖ´ÐÐÆ÷¹¤¾ß£¬²¢ÎªÄÇЩ¾ßÓÐÒ»¸ö·µ»ØÀàÐ͵ķ½·¨ÌṩÁËÒ»¸ö·½·¨À´Òì²½µØ½ÓÊÕ»ØÏìÓ¦¡£ÒªÊ¹ÓÃÕâ¸ö·½Ã棬ÄúÖ»Ðè±ê¼ÇÒ»¸ö·½·¨Îª@Asybchronous.


¡¡¡¡



¡¡¡¡

Çåµ¥18£º

¡¡¡¡



¡¡¡¡

public Foo {

¡¡¡¡@Asynchronous public int someMethod(int someArg) {...}

¡¡¡¡}

¡¡¡¡


¡¡¡¡

@Asynchronous±êÇ©µÄÓ¦ÓÃ×öÁËһЩÊÂÇé¡£ÓëÔÚ±¾ÎÄÖеÄ@OnewayÀý×ÓÒ»Ñù£¬ËüÓ¦ÓÃÒ»¸öÔÚºǫ́ÔËÐи÷½·¨µÄ·½Ãæ¡£¶øÇÒ£¬²ÉÓÃ@Asynchronous±êÇ©£¬Äú²¢²»½öÏÞÓÚvoid·½·¨²¢¿ÉÓÚʵ¼ÊÉÏ·µ»ØÒ»¸öÖµµÄ·½·¨½øÐн»»¥¡£µ±@Asynchronous±êÇ©±»Ó¦Óã¬ËüÇ¿ÖÆFooÀàʵÏÖAsynchronousFacade½Ó¿Ú¡£ÔÚAOPÁìÓò£¬Õâ³ÆÎª½Ó¿ÚÒýÈ루interface introduction£©¡£AsynchronousFacade½Ó¿ÚÔÊÐíÄúÔ¤²âÒ»¸öÏìÓ¦»òÒÔ³¬Ê±ÏÞ¶¨µÈ´ýÒ»¸öÏìÓ¦¡£×îºÃÓÃÒ»¸öÀý×ÓÀ´½âÊÍ¡£

¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥19£º


¡¡¡¡



¡¡¡¡

Foo foo = new Foo();

¡¡¡¡someMethod(555); // executes in background

¡¡¡¡AsynchronousFacade facade = (AsynchronousFacade)foo;

¡¡¡¡AsynchronousResponse response = facde.waitForResponse();

¡¡¡¡System.out.println(response.getReturnValue());


¡¡¡¡



¡¡¡¡



¡¡¡¡Äú¿ÉÒÔÆô¶¯¶à¸ö²»Í¬¶ÔÏóµÄ¶à¸ö²»Í¬·½·¨µÄ¶à¸öµ÷Ó㬲¢Òì²½»ýÀÛËüÃǵÄÏìÓ¦¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡ÊÂÎñËø¶¨


¡¡¡¡



¡¡¡¡



¡¡¡¡ÓÐʱÔÚJ2EEÊÂÎñÆÚ¼ä¶ø²»ÊÇÒ»¸ö·½·¨Ö´ÐУ¬¹¹Ô캯Êýµ÷Óûòͬ²½¿éÖ´ÐÐÆÚ¼äͬ²½Ò»¸ö¶ÔÏó»òÀà»áºÜÓÐÓ᣶ÔÕâÀàÊÂÎñͬ²½»òËø¶¨£¬Jboss AOP·¢Ã÷ÁË@TxSynchronized¹Ø¼ü×Ö¡£Äú¿ÉÒÔʹÓÃ@TxSynchronizedÔÚÈÎÒâ³ÉÔ±»ò¾²Ì¬·½·¨ÒѾ­¹¹Ô캯ÊýÉÏ¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥20£º


¡¡¡¡



¡¡¡¡

import org.jboss.aspects.txlock.TxSynchronized;

¡¡¡¡public FooBar

¡¡¡¡{

¡¡¡¡@TxSynchronized public FooBar() {}

¡¡¡¡@TxSynchronized static void staticMethod() {}

¡¡¡¡@TxSynchronized public memberMethod() {}

¡¡¡¡}


¡¡¡¡



¡¡¡¡



¡¡¡¡Èç¹ûÒ»¸ö±»±ê¼ÇΪ@TxSynchronizedµÄ¹¹Ô캯Êý»ò¾²Ì¬·½·¨±»µ÷Óã¬ÀàµÄËø¼àÊÓÆ÷»áÔÚÊÂÎñÖ´ÐÐÆÚ¼ä±»±£³Ö×Å¡£Èç¹ûÒ»¸ö±ê¼ÇΪ@TxSynchronizedµÄ³ÉÔ±·½·¨±»µ÷Ó㬸öÔÏóʵÀýµÄËø¼àÊÓÆ÷½«±»±£³ÖÖ±µ½Ä¿Ç°µÄÊÂÎñÌá½»»ò»ØÍË¡£¿ØÖƸÃÐÐΪµÄ·½ÃæÒ²½«×öËÀËø¼ì²â²¢ÔÚ·¢ÉúËÀËøÊ±Å׳öRuntimeException.


¡¡¡¡



¡¡¡¡



¡¡¡¡J2EE É¢²Í£¨Ô­ÎÄ·¨ÎÄ£ºa la carte£©Ö®£ºÊÂÎñ»®·Ö


¡¡¡¡



¡¡¡¡



¡¡¡¡EJB3.0ÒѾ­¶¨ÒåÁËһЩAnnotation½øÐÐÊÂÎñ»®·Ö¡£Jboss AOPÔÚ´Ë»ù´¡ÉϹ¹½¨¡£ÕâÑùÄú¿ÉÒÔͨ¹ýÖ¸¶¨AnnotationÓ¦ÓÃÊÂÎñ»®·Öµ½ÈÎÒâ·½·¨£¨¾²Ì¬»ò³ÉÔ±£©ÒÔ¼°ÈκÎJavaÀ๹Ô캯Êý¡£


¡¡¡¡



¡¡¡¡

Çåµ¥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ʵÏÖ»ùÓÚ½ÇÉ«µÄ°²È«¡£Jbos AOPÊÇ»ùÓڴ˹¹½¨µÄ£¬ËùÒÔÄú¿ÉÒÔÓ¦ÓûùÓÚ½ÇÉ«µÄ°²È«µ½ÈκεÄ×ֶλò·½·¨£¨¾²Ì¬»ò³ÉÔ±£©ÒѾ­¹¹Ô캯Êý¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥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¹æ·¶Ò»Æð½¥½¥³ÉÊ죬ÎÒÕæÕýÏ£Íû·¢ÉúµÄÊÇEJB¹æ·¶¶¨ÒåµÄAnnotation½«ÄÜÔÚÈκÎÉÏÏÂÎÄ×÷ΪеÄJavaÓïÑÔµÄÐÎÈݴʱ»Ê¹Ó㬶ø²»ÊÇÈÃËüÃÇÓÐÏÞµÄʹÓÃÔڻỰbeanÖС£ÏëÏóһϣ¬Ò»¸öÕæÕýµÄÎÞ״̬bean½ö½ö³ÉΪһ¸öÃ÷ÎÄJavaÀàµÄÒ»¸ö¾²Ì¬·½·¨¼¯¡£


¡¡¡¡



¡¡¡¡



¡¡¡¡Çåµ¥23£º


¡¡¡¡



¡¡¡¡

public MySessionBean

¡¡¡¡{

¡¡¡¡@Tx(TxType.REQUIRED) public static doSomething() {...}

¡¡¡¡}


¡¡¡¡



¡¡¡¡ÎÞÂÛÈçºÎ£¬ÕâЩ¹ØÓÚAOPºÍEJBµÄÌÖÂۺܿÉÄܾÍÊÇΪÁËEJB4.0.


¡¡¡¡



¡¡¡¡



¡¡¡¡½áÂÛ


¡¡¡¡



¡¡¡¡



¡¡¡¡²¢·ÇÊÇÏÞÖÆJ2SE5.0AnnotationÓÃÓÚ´úÂëÉú³É£¬AnnotationºÍAOP¿ÉÒÔ±»½áºÏÆðÀ´ÌṩеÄÄÜÁ¦¸ø¿ò¼Ü¿ª·¢Õß¡£ÕâÒ»½áºÏÔÊÐí¿ª·¢Õß¶¨ÒåеľßÓÐÐÐΪ¸½¼Óµ½ÆäÉϵÄJavaÓï·¨¡£»ù±¾ÉÏ£¬ÒÔ°²È«µÄ·½Ê½À©Õ¹JavaÓïÑÔµÄÄÜÁ¦ÒѾ¡ÔÚÕÆÎÕ¡£