springboot2.0 + shiro + ehcache整合之解决多缓存管理器被创建的问题(只能创建一个缓存管理器)

springboot2.0 +shiro + ehcache整合

一:依赖包:

(1) shiro 与 spring 整合的依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.3.2</version>
</dependency>

(2) shrio与ehcache整合的依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-ehcache</artifactId>
    <version>1.4.0</version>
</dependency>

以上两各依赖再加上下面的配置可完成三者相互之间的整合,在使用缓存之前,我们需要开启缓存注解在启动类中加上:@EnableCaching,否则缓存注解不会生效。

二:springboot与ehcache整合,这里采用代码的方式,当然也可以采用配置文件的方式,在application.properties中指定spring.cache.ehcache.config=classpath:ehcache.xml方式(如果只是将springboot与echcache整合),这是我们需要将shiro加入进来,那么我们需要改变一种方式来让springboot和shrio都能使用ehcache缓存,这里要明确的一点是在shiro2.5以后的版本不允许再一个应用中出现两个缓存管理器,只允许一个缓存管理器的定义(这是使用ehcache使用缓存的关键)那么如何做到这一点哪,这里就需要定义一个缓存管理器工厂bean,该bean属于spring范畴之内,通过该工厂bean让缓存管理器被spring(spring主要用于缓存数据库数据及其它的需要缓存的数据)和shrio共享(shiro主要用于会话的存储和持久化)代码如下:

@Bean
public EhcacheManagerFactoryBean ehcacheManagerFactoryBean () {
    EhcacheManagerFactoryBean ehcacheManagerFactoryBean = new EchacacheManagerFactoryBean();  // 该工厂bean产生并管理缓存管理器
    if (isNullOfCacheManagerObject(ehcacheManagerFactoryBean)) {  // 如果还没有产生缓存管理器,那么就配置该ehcacheManagerFactoryBean 用于创建缓存管理器。
       configEhcacheManagerFactoryBean(ehcacheManagerFactoryBean);
    }
    return ehcacheManagerFactoryBean;  // 返回配置好的缓存管理器工厂bean
}

private boolean isNullOfCacheManagerObject (EhcacheManagerFactoryBean ehcacheManagerFactoryBean ) {
    return ehcacheManagerFactory.getObject() == null;
}

private configEhcacheManagerFactoryBean (EhcacheManagerFactoryBean ehcacheManagerFactoryBean) {
    ehcacheManagerFactoryBean.setConfiguration(new ClassPathResource("ehcache.xml"));
    ehcacheManagerFactoryBean.setShared(true);  // 关键,让该工厂创建的管理器能够被共享, spring本身能使用创建的缓存管理器,shrio也能使用该缓存管理器。
} 


@Bean
public EhcacheCacheManager springCacheManager () {
    EhcacheCacheManager ehcacheCacheManager = new EhcacheCacheManager();
    EhcacheManagerFactoryBean ehcacheManagerFactoryBean = ehCacheManagerFactoryBean();
    ehcacheCacheManager.setCacheManager(ehcacheManagerFactory.getObject());
}

@Bean
public EhcacheManager shiroCacheManager () {
    EhcacheManager cacheManager = new EhcacheManager();
    EhcacheManagerFactoryBean ehcacheManagerFactoryBean = ehCacheManagerFactoryBean();
    cacheManager.setCacheManager(ehcacheManagerFactoryBean.getObject());
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值