问题

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等缓存注解

相关文章:

  • 2021-12-27
  • 2022-12-23
  • 2022-12-23
  • 2021-07-25
  • 2022-12-23
  • 2021-05-18
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-01-20
  • 2021-06-16
  • 2022-12-23
  • 2021-11-13
相关资源
相似解决方案