在一个对象中,两个方法互相调用,那么其中的切面是不会生效的。比如在一个方法中声明了缓存注解,另一个方法再去调用,那么就有可能不会生效。

场景


出现这种情况的原因:
在使用Spring AOP的时候,我们从 IOC 容器中获取的 Bean 对象其实都是代理对象,而不是那些 Bean 对象本身,而当在自己的 Service 类中使用 this 关键字嵌套调用同类中的其他方法时,由于 this 关键字引用的并不是该 Service Bean 对象的代理对象,而是其本身,故Spring AOP是不能拦截到这些被嵌套调用的方法的。

解决方法

  1. 写一个方法类获取容器中的bean,手动用获取的bean进行调用;
  2. 将当前代理类暴露给线程使用,显示调用代理对象,比如配置:<aop:aspectj-autoproxy expose-proxy="true" />或者Springboot添加配置注解@EnableAspectJAutoProxy(exposeProxy=true),然后使用方法获取代理类:UserServiceImpl service = AopContext.currentProxy() != null ? (UserService)AopContext.currentProxy() : this;
  3. 将方法单独抽离出一个类;
  4. 合并方法。