aspectj this target within 区别

首先他们三个都匹配一个明确的类型 里面的所有方法 不能带有方法,包名等通配符

只能写成  within(包名.类名格式)

 

 

假设有一下继承关系

  有一个接口 A ,这个接口有一个实现类A1

  A1 有两子类 B,C

 

1 within 只能匹配指定类型不能匹配子类,并且对比类型是目标类型,target 和 this 可以

 

 

2 this 对比类型是生成的代理对象的类型(也可能不会生成代理类,如果没有增强逻辑)

    

  打印类信息类似: com.lomi.aspectj.Fan$$EnhancerBySpringCGLIB$$5152d3d4 的是cgLib 代理

  打印类信息类似: com.sun.proxy.$Proxy4 的是jdk 动态代理

 

3 target 对比的类型 目标对象的类型

 

  指的就是你自己写的java类或者接口,你真是使用的可能是 你定义的类型,也可能是 代理类(有aop 增强逻辑的this和target类型不同,没有增强逻辑的 this 和 target 类型相同)

 

 

 

4 this 和 target 的不同点

 

  区别在于匹配类型是实现类(比如 C,或者B的时候),而不是父接口,并且使用 jdk 代理的时候  

 

  使用 cglib 代理的时候 this(C) 和 target(C) 都能匹配到C  (这时候你获取到的 真实对象是 $$EnhancerBySpringCGLIB 类型)

 

  使用 jdk 代理的时候 this(C) 和 target(C) 只有 target(C) 才能匹配到 C(这时候你获取到的 真实对象是 com.sun.proxy.$Proxy 类型)

 

  备注:如果 this(A) 和 target(A) 在任何时候匹配的都是一样的,能匹配到

 

5 within 和 target ,this  的不同点

  within 只能 匹配指定类型不能匹配到实现类子类,target 和 this都可以匹配到子类

  

  with(A) 是匹配不到 B,C的 ,也匹配不到 A1

 

  within(A+) 可以匹配到 A1,B,C (  通配符 + 匹配子类) 这时候等同于 target(A)

 

posted on 2022-07-17 02:02  zhangyukun  阅读(121)  评论(0编辑  收藏  举报

导航