您的位置:首页 > 运维架构 > Apache

Spring Cache 和 Apache Shiro整合的超级深坑

2016-07-04 00:00 656 查看
摘要: spring cache apache shiro

历时1天,跟踪了一天spring aop的源代码。最后在google上找到了答案。

写个笔记记录,希望遇到相同问题的同学,可以避免这个问题。

问题概述

项目到了尾声,需要使用缓存进行优化,项目中使用了shiro技术作为权限框架,spring cache注解形式进行缓存。

发现cache没有起到作用,匪夷所思。于是跟踪spring aop 的源代码发现,在bean创建代理类的过程,根本没有创建spring的cache对象,下面是debug跟踪的具体方法

[code=language-java]org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(Class<?>, String, Object[], TargetSource)

后来注释掉了shiro配置文件中的

[code=plain]<!-- 开启shiro注解支持 -->
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>

发现可以正常创建ceche代理对象。

最后解决方案,只需要在自定义的shiroRealm中引用service时,加上

[code=plain]@Lazy

一切都正常了。。

具体问题产生原因参考

http://stackoverflow.com/questions/21512791/spring-service-with-cacheable-methods-gets-initialized-without-cache-when-autowi

额外补充另外一个问题

关于spring cache注解使用发现部分方法没有成功进行缓存代理,可进行debug跟踪

[code=language-java]org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheOperationInvoker, Object, Method, Object[])

观察具体的方法入参,以及是否生成代理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: