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为空,所以就拿不到代理
posted @ 2022-08-18 17:24  rm-rf*  阅读(35)  评论(0编辑  收藏  举报