历时1天,跟踪了一天spring aop的源代码。最后在google上找到了答案。
写个笔记记录,希望遇到相同问题的同学,可以避免这个问题。
问题概述
项目到了尾声,需要使用缓存进行优化,项目中使用了shiro技术作为权限框架,spring cache注解形式进行缓存。
发现cache没有起到作用,匪夷所思。于是跟踪spring aop 的源代码发现,在bean创建代理类的过程,根本没有创建spring的cache对象,下面是debug跟踪的具体方法
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(Class<?>, String, Object[], TargetSource)
后来注释掉了shiro配置文件中的
<!-- 开启shiro注解支持 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>
发现可以正常创建ceche代理对象。
最后解决方案,只需要在自定义的shiroRealm中引用service时,加上
@Lazy
一切都正常了。。
具体问题产生原因参考
额外补充另外一个问题
关于spring cache注解使用发现部分方法没有成功进行缓存代理,可进行debug跟踪
org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheOperationInvoker, Object, Method, Object[])
观察具体的方法入参,以及是否生成代理。