当前位置:   article > 正文

AspectJ工作原理和学习总结

_aroundbody2

AspectJ是什么?AspectJ能干什么?AspectJ是怎么干活的?

  1. AspectJ是什么

    AspectJ是一个代码生成工具(Code Generator)。
    AspectJ语法就是用来定义代码生成规则的语法。您如果使用过Java Compiler Compiler (JavaCC),您会发现,两者的代码生成规则的理念惊人相似。
    AspectJ有自己的语法编译工具,编译的结果是Java Class文件,运行的时候,classpath需要包含AspectJ的一个jar文件(Runtime lib)。
    AspectJ和xDoclet的比较。AspectJ和EJB Descriptor的比较。

  2. AspectJ能干什么?

     AOP是Object Oriented Programming(OOP)的补充。
    OOP能够很好地解决对象的数据和封装的纵向问题,却不能很好的解决Aspect("方面")分离的横向问题

  3. 使用价值

    认证、事务、日志等等

    如:你已经写好一个功能,有一天客户提出一个需求,需要对调用这个服务的用户进行权限认证,这时候通过AspectJ实现一个AOP是你的首选。

  4. AspectJ是怎么干活的?

    182022_C3Yb_1458864.png

    背景:定义一个Class,如果需要对这个Class的get和set方法进行进行切入

    实现方案:

    一、定义aj规则文件,通过调用call方法实现around切入

    二、定义aj规则文件,通过调用execution方式实现around切入

    过程:定义一个Class,定义一个编译规则,然后反编译class我们看工作过程 

    实现原理:通过定义aj规则文件,由AspectJ编译器扫描包内的aj文件进行规则读取,然后对java代码进行包装后编译成class文件,这个class文件可以被AspectJ的runtime识别并工作,所以在使用AspectJ时一定要引入aspectj.runtime包

     

    方案一:定义aj规则文件,通过调用call方法实现around切入

    Object1.java

  1. package bean;
  2. public class Object1 {
  3.  private int x=1;
  4.  public int getInfo(){
  5.   
  6.   return this.x;
  7.  }
  8.  
  9.  public void setInfo(int x){
  10.   this.x=x;
  11.  }
  12. }

Demo1BoundObject1.aj

  1. package bean;
  2. aspect Demo1BoundObject1 {
  3.  pointcut setter(Object1 object1): call(void Object1.set*(*))&&target(object1);
  4.  void around(Object1 object1): setter(object1){
  5.   String name = thisJoinPointStaticPart.getSignature().getName();
  6.   System.out.println("before :" + name);
  7.   proceed(object1);
  8.   System.out.println("after :" + name);
  9.  }
  10.  pointcut getter(Object1 object1): call(int Object1.get*())&&target(object1);
  11.  int around(Object1 object1): getter(object1){
  12.   String name = thisJoinPointStaticPart.getSignature().getName();
  13.   System.out.println("before :" + name);
  14.   return proceed(object1);
  15.  }
  16. }

 Demo1.java

 

  1. package bean;
  2. public class Demo1 {
  3.  public static void main(String[] args){
  4.   
  5.   Object1 obj=new Object1();
  6.   obj.setInfo(2);
  7.   obj.getInfo();
  8.   
  9.  }
  10. }

 进行反编译:

    Demo1.class

  1. // Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 2014/7/4 16:12:27
  2. // Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   Demo1.java
  5. package bean;
  6. import java.io.PrintStream;
  7. import org.aspectj.lang.Signature;
  8. import org.aspectj.runtime.internal.AroundClosure;
  9. import org.aspectj.runtime.reflect.Factory;
  10. // Referenced classes of package bean:
  11. //            Object1, Demo1BoundObject1
  12. public class Demo1
  13. {
  14.     public Demo1()
  15.     {
  16.     }
  17.     public static void main(String args[])
  18.     {
  19.         Object1 obj = new Object1();
  20.         byte byte0 = 2;
  21.         Object1 object1 = obj;
  22.         setInfo_aroundBody1$advice(object1, byte0, Demo1BoundObject1.aspectOf(), object1, null, ajc$tjp_0);
  23.         Object1 object1_1 = obj;
  24.         getInfo_aroundBody3$advice(object1_1, Demo1BoundObject1.aspectOf(), object1_1, null, ajc$tjp_1);
  25.     }
  26.     private static final void setInfo_aroundBody0(Object1 object1, int i)
  27.     {
  28.         object1.setInfo(i);
  29.     }
  30.     private static final void setInfo_aroundBody1$advice(Object1 target, int x, Demo1BoundObject1 ajc$aspectInstance, Object1 object1, AroundClosure ajc$aroundClosure, org.aspectj.lang.JoinPoint.StaticPart thisJoinPointStaticPart)
  31.     {
  32.         String name = thisJoinPointStaticPart.getSignature().getName();
  33.         System.out.println((new StringBuilder("before :")).append(name).toString());
  34.         AroundClosure aroundclosure = ajc$aroundClosure;
  35.         Object1 object1_1 = object1;
  36.         setInfo_aroundBody0(object1_1, x);
  37.         System.out.println((new StringBuilder("after :")).append(name).toString());
  38.     }
  39.     private static final int getInfo_aroundBody2(Object1 object1)
  40.     {
  41.         return object1.getInfo();
  42.     }
  43.     private static final int getInfo_aroundBody3$advice(Object1 target, Demo1BoundObject1 ajc$aspectInstance, Object1 object1, AroundClosure ajc$aroundClosure, org.aspectj.lang.JoinPoint.StaticPart thisJoinPointStaticPart)
  44.     {
  45.         String name = thisJoinPointStaticPart.getSignature().getName();
  46.         System.out.println((new StringBuilder("before :")).append(name).toString());
  47.         AroundClosure aroundclosure = ajc$aroundClosure;
  48.         Object1 object1_1 = object1;
  49.         return getInfo_aroundBody2(object1_1);
  50.     }
  51.     private static void ajc$preClinit()
  52.     {
  53.         Factory factory = new Factory("Demo1.java", bean/Demo1);
  54.         ajc$tjp_0 = factory.makeSJP("method-call", factory.makeMethodSig("1""setInfo""bean.Object1""int""x""""void"), 8);
  55.         ajc$tjp_1 = factory.makeSJP("method-call", factory.makeMethodSig("1""getInfo""bean.Object1""""""""int"), 9);
  56.     }
  57.     private static final org.aspectj.lang.JoinPoint.StaticPart ajc$tjp_0; /* synthetic field */
  58.     private static final org.aspectj.lang.JoinPoint.StaticPart ajc$tjp_1; /* synthetic field */
  59.     static 
  60.     {
  61.         ajc$preClinit();
  62.     }
  63. }

 Object1.class

  1. // Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 2014/7/4 16:14:31
  2. // Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   Object1.java
  5. package bean;
  6. public class Object1
  7. {
  8.     public Object1()
  9.     {
  10.         x = 1;
  11.     }
  12.     public int getInfo()
  13.     {
  14.         return x;
  15.     }
  16.     public void setInfo(int x)
  17.     {
  18.         this.x = x;
  19.     }
  20.     private int x;
  21. }

 

方案二、定义aj规则文件,通过调用execution方式实现around切入

    Demo1.java

  1. package bean;
  2. public class Demo1 {
  3.  public static void main(String[] args){
  4.   
  5.   Object1 obj=new Object1();
  6.   obj.setInfo(2);
  7.   obj.getInfo();
  8.   
  9.  }
  10. }

 

Object1.java

  1. package bean;
  2. public class Object1 {
  3.  private int x=1;
  4.  public int getInfo(){
  5.   
  6.   return this.x;
  7.  }
  8.  
  9.  public void setInfo(int x){
  10.   this.x=x;
  11.  }
  12. }

Demo1BoundObject1.aj

  1. package bean;
  2. aspect Demo1BoundObject1 {
  3.  pointcut bankMethods(Object1 object1) : (execution (* Object1.get*()) || execution (* Object1.set*(*)))&&target(object1);
  4.  Object around(Object1 object1): bankMethods(object1)
  5.    {
  6.   // 验证account是否为合法用户
  7.   String name = thisJoinPointStaticPart.getSignature().getName();
  8.   System.out.println("bankMethods before :" + name);
  9.   Object result = proceed(object1);
  10.   return result;
  11.  }
  12. }

Demo1.class

  1. // Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 2014/7/4 16:22:53
  2. // Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   Demo1.java
  5. package bean;
  6. // Referenced classes of package bean:
  7. //            Object1
  8. public class Demo1
  9. {
  10.     public Demo1()
  11.     {
  12.     }
  13.     public static void main(String args[])
  14.     {
  15.         Object1 obj = new Object1();
  16.         obj.setInfo(2);
  17.         obj.getInfo();
  18.     }
  19. }

Object1.class

  1. // Decompiled by DJ v3.11.11.95 Copyright 2009 Atanas Neshkov  Date: 2014/7/4 16:23:17
  2. // Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   Object1.java
  5. package bean;
  6. import java.io.PrintStream;
  7. import org.aspectj.lang.Signature;
  8. import org.aspectj.runtime.internal.AroundClosure;
  9. import org.aspectj.runtime.internal.Conversions;
  10. import org.aspectj.runtime.reflect.Factory;
  11. // Referenced classes of package bean:
  12. //            Demo1BoundObject1
  13. public class Object1
  14. {
  15.     public Object1()
  16.     {
  17.         x = 1;
  18.     }
  19.     public int getInfo()
  20.     {
  21.         return Conversions.intValue(getInfo_aroundBody1$advice(this, Demo1BoundObject1.aspectOf(), thisnull, ajc$tjp_0));
  22.     }
  23.     public void setInfo(int x)
  24.     {
  25.         int i = x;
  26.         setInfo_aroundBody3$advice(this, i, Demo1BoundObject1.aspectOf(), thisnull, ajc$tjp_1);
  27.     }
  28.     private static final int getInfo_aroundBody0(Object1 ajc$this)
  29.     {
  30.         return ajc$this.x;
  31.     }
  32.     private static final Object getInfo_aroundBody1$advice(Object1 ajc$this, Demo1BoundObject1 ajc$aspectInstance, Object1 object1, AroundClosure ajc$aroundClosure, org.aspectj.lang.JoinPoint.StaticPart thisJoinPointStaticPart)
  33.     {
  34.         String name = thisJoinPointStaticPart.getSignature().getName();
  35.         System.out.println((new StringBuilder("bankMethods before :")).append(name).toString());
  36.         AroundClosure aroundclosure = ajc$aroundClosure;
  37.         Object1 object1_1 = object1;
  38.         Object result = Conversions.intObject(getInfo_aroundBody0(object1_1));
  39.         return result;
  40.     }
  41.     private static final void setInfo_aroundBody2(Object1 ajc$thisint x)
  42.     {
  43.         ajc$this.x = x;
  44.     }
  45.     private static final Object setInfo_aroundBody3$advice(Object1 ajc$thisint x, Demo1BoundObject1 ajc$aspectInstance, Object1 object1, AroundClosure ajc$aroundClosure, org.aspectj.lang.JoinPoint.StaticPart thisJoinPointStaticPart)
  46.     {
  47.         String name = thisJoinPointStaticPart.getSignature().getName();
  48.         System.out.println((new StringBuilder("bankMethods before :")).append(name).toString());
  49.         AroundClosure aroundclosure = ajc$aroundClosure;
  50.         Object1 object1_1 = object1;
  51.         setInfo_aroundBody2(object1_1, x);
  52.         Object result = null;
  53.         return result;
  54.     }
  55.     private static void ajc$preClinit()
  56.     {
  57.         Factory factory = new Factory("Object1.java", bean/Object1);
  58.         ajc$tjp_0 = factory.makeSJP("method-execution", factory.makeMethodSig("1""getInfo""bean.Object1""""""""int"), 6);
  59.         ajc$tjp_1 = factory.makeSJP("method-execution", factory.makeMethodSig("1""setInfo""bean.Object1""int""x""""void"), 11);
  60.     }
  61.     private int x;
  62.     private static final org.aspectj.lang.JoinPoint.StaticPart ajc$tjp_0; /* synthetic field */
  63.     private static final org.aspectj.lang.JoinPoint.StaticPart ajc$tjp_1; /* synthetic field */
  64.     static 
  65.     {
  66.         ajc$preClinit();
  67.     }
  68. }

 

转载于:https://my.oschina.net/u/1458864/blog/287389

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/266732
推荐阅读
相关标签
  

闽ICP备14008679号