zoukankan      html  css  js  c++  java
  • 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等缓存注解

  • 相关阅读:
    Java泛型
    Java多态
    Anaconda+pycharm配置pytorch1.1.0+cuda 9.0+python3.7环境
    anaconda+fbprophet安装
    pycharm显示所有的tabs
    联想拯救者15-isk安装固态硬盘与系统迁移教程
    VS2017 C++操作mysql数据库
    mfc动态演示排序算法
    模拟处理机作业调度---短作业优先调度算法
    P3327 [SDOI2015]约数个数和
  • 原文地址:https://www.cnblogs.com/Unicron/p/12578842.html
Copyright © 2011-2022 走看看