文章最后,当两个同为缓存的方法出现相互之间的内部调用时,出现被调用方法缓存失效,现给出解决方案:
1. 让原有类实现一个可注入自身代理类的接口,接着为所有实现了该接口的bean执行自身代理bean的注入,现给出可复用的注入装配器如下(实现逻辑为,从Spring容器中获取所有实现该接口的bean,循环迭代遍历这些bean,并调用接口中的方法将自身代理类注入自己)
2. 在Spring容器启动之后加载1中写好的注入装配器
3. 需要告诉Spring什么时候触发1中写好的注入装配器,这里设置一个启动管理器(实现逻辑为,通过自动注入方式注入所有实现SystemBootAddon的插件,接着调用这些插件,通过监听Spring容器的ContextRefreshedEvent实现)
具体实现可参考《精通Spring4.x企业应用开发实战》P266 - P287。
P.S.该问题的关键是AOP使用动态代理模式实现,在自调用的过程中,是类自身的调用,而不是代理对对象去调用,所以就不会将类自身的调用织入我们的流程中,例如缓存和事务。解决该问题的关键在于要使用代理对象去调用,