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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jialijuan521_zhang/article/details/85913613

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());
}

猜你喜欢

转载自blog.csdn.net/jialijuan521_zhang/article/details/85913613