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) 只有 this(C) 才能匹配到 C(这时候你获取到的 真实对象是 com.sun.proxy.$Proxy 类型)

 

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

 

5 within 和 target ,this  的不同点

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

  

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

  

  cgllib代理模式下, with(A1)  可以匹配代 A1,jdb 代理 匹配不到 (jdk 动态代理 只能实现A接口的代理,不是A1,cglib 的代理 可以单做是 B,C 的子类 类型也是 A1)

 

  within(C) 在 cglib 代理下 可以匹配到C,jdk 代理下匹配不到 C(jdk 类型下 是指定接口的子类,然后接口又没有实现 ,within 又不能匹配之类,所以 啥都匹配不到)

 

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

 

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/274893.html

(0)
上一篇 2022年7月17日
下一篇 2022年7月17日

相关推荐

发表回复

登录后才能评论