首先他们三个都匹配一个明确的类型 里面的所有方法 不能带有方法,包名等通配符
只能写成 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