Aop的失效场景和原理,以及解决办法

时间:2025-02-09 17:30:39

失效场景

  • 首先我们只要知道什么样的方法不能被子类重写,也就知道了aop失效的一部分情况

比如 final 修饰的、static 修饰的 、private 修饰的和构造方法

  • 调用与被调用的方法在同一个类中,显而易见,如果当前在一个类中有两个方法A、B,其中B被aop加强了,然后A调用B,因为是在类内部调用的,此时A调用的是当前类中的方法,而不是其子类加强后的方法,所以会失效
  • 引用公共模块时,如果包路径不相同则会失效。因为spring boot中会默认扫面包路径下的类来加入到ioc的容器中,如果公共类的中的包路径和引用模块的路径不相同,导致公共模块下的对象不能被ioc管理,导致aop失效(下附解决方法)

解决方法:

   首先第一种和第三种没什么好说的,主要是第二种的解决方法:

可以在代理的接口实现类上加一个注解:

1.@EnableAspectJAutoProxy(exposeProxy = true)

 2.调用被加强的方法时,强制获取代理对象,通过代理对象去调用

      if (null != ()) {
            list = ((动态代理实现类)()).加强方法();

        }else{
     
   //这里表示获取到代理对象,则直接调用代理方法即可
加强方法()
      
          }

两种代理方法的区别:

jdk动态代理:有接口的地方,会去创建接口实现类的代理对象(目前使用都是jdk,效率低于cglib,如果要使用cglib,需要进行特殊配置)

cglib动态代理:只有类的地方,会去创建子类的代理对象