版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
}