AOP代理
JDK代理和CGLIB代理
- jdk动态代理,是jvm自身实现的一个代理,最核心的点在于是一种基于接口的代理,所以如果没有实现接口的话……
- cglib代理,核心原理是修改字节码,通过继承来实现代理对象,也就是说如果没法继承(如final修饰符),那么……
@EnableAspectJAutoProxy开启AOP
参数:
proxyTargetClass
默认false
,使用哪种代理方式true
- 目标对象实现了接口 –> 使用CGLIB代理机制
- 目标对象没有接口(只有实现类) – 使用CGLIB代理机制
false
- 目标对象实现了接口 –> 使用JDK动态代理机制(代理所有实现了的接口)
- 目标对象没有接口(只有实现类) – 使用CGLIB代理机制
exposeProxy
默认false
,是否在ThreadLocal
中暴露代理对象true
false
:不处理(不代理)- 可以通过AopContext.currentProxy()获得这个代理对象的一个副本(ThreadLocal里面),从而我们可以很方便得在Spring框架上下文中拿到当前代理对象,然后用代理对象调用类内部的其他方法,或者注入自身类的代理
@Autowired
private MyClass _this;
常见代理失效
- 类内部方法间调用,a方法调用b方法,b方法无法触发代理.可以用AopContext.currentProxy()获取代理对象,然后调用b方法,或者注入自己类,然后用注入的类调用b方法
- static ,final,private 等修饰,虽然aspectj可以代理private,但不建议这么做
- 未被spring管理
- AopContxt.currentProxy()方法不能放到子线程中进行获取,因为AopContext.currentProxy()使用的是LocalThread存储当前代理,在新的线程中,LocalThread为空,所以就拿不到代理
你要是觉得写的还不错,就点个关注,可以评论区留下足迹,以后方便查看.
你要是觉得写的很辣鸡,评论区欢迎来对线!
欢迎转载!