shiro整合Cache時@Cacheable失效原因及解決方法


問題

shiro整合cache時,發現服務層中標注有緩存注解的方法並沒有調用緩存方法

而是每次都直接調用方法實體,導致緩存功能失效

 

原因

public class UserRealm extends AuthorizingRealm{

    @Autowired
    private UserService userService;

spring在注冊bean時,會先找到並注冊bean中依賴的其他bean

所以在上面的情況中,注冊UserRealm時也把服務層userService的實現類也注冊了

但這並不是問題的關鍵

緩存的實現關鍵在於方法上的@Cacheable注解

緩存組件掃描到了這個注解,通過相關機制創建代理對象,AOP自然能執行緩存操作

問題在於shiro在容器創建流程的rigisterBeanPostprocessors階段中就注冊相關組件了

上面的UserRealm就是在rigisterBeanPostprocessors時注冊的,使得自動注入的UserService實現類被提前創建

而緩存有關組件是在之后的finisBeanfactoryInitialization方法中才進行注冊

所以提前被創建的Service實現類中的@Cacheable等緩存注解是掃描不到的

 

解決方法

由上面的分析得出,Service需要在緩存組件注冊之后進行創建

所以給Service屬性上再加上一個@Lazy注解

利用懶加載,避免和Realm同時注冊,在用到的時候再注冊

那時cache組件自然是已經創建好了,能夠正常識別@Cacheable等緩存注解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM