一、Spring AOP注解失效及解决办法
首先,AOP注解都是由动态代理实现的。
1. 在对象内部方法A调用该对象另一个带AOP注解的方法B,被调用方法的AOP注解失效。
第一种情况:方法A没有带AOP注解,那么在方法A中调用方法B不走代理,注解失效。
第二种情况:方法A带AOP注解,方法A是由代理对象调用的。而在方法A内部调用B方法,实际上是被代理对象调用的B方法(即this.B),不走代理。
解决方案:(1)避免在方法内部调用;(2)第二种情况,获取当前代理对象,在方法内部使用代理对象调用B;
2. AOP注解的方法中使用@Autowired注入的对象为null
原因:AOP注解的方法是private方法,JDK动态代理是通过创建代理接口的实现类来实现,CGLIB是通过子类实现的。无论是接口还是父类,都不能出现private方法,不然实现类或子类无法覆盖。
如果方法是private或父类中方法被final修饰(注:final不能修饰抽象类和接口),导致代理过程中找不到该方法,引起代理对象创建出现问题,也导致了有的对象没有注入进来。
所以,如果方法需要AOP注解,需要方法为非private。
TODO:待整理
1.https://blog.csdn.net/fumushan/article/details/80090947 Spring AOP注解失效原因和解决方案
2.https://blog.csdn.net/tanga842428/article/details/52716875 Spring两种代理浅谈
3.https://www.cnblogs.com/hongwz/p/5764917.html AOP详解
4.https://www.cnblogs.com/xiaoluo501395377/p/3383130.html java动态代理机制详解
5.https://blog.csdn.net/lookthatgirl/article/details/36387509 Spring AOP代理Controller类
6、https://www.cnblogs.com/gonjan-blog/p/6685611.html 代理模式详解(很好)
7、https://blog.csdn.net/jiangyunlovec/article/details/53413516 Proxy