問題
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等緩存注解