¡¡¡¡
¡¡¡¡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
|