在Spring Boot中开启热部署功能后,整合Shiro和Ehcache缓存时发生如下的异常信息:
Caused by: net.sf.ehcache.CacheException: Another CacheManager with same name 'shiro-cache' already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following: 1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary 2. Shutdown the earlier cacheManager before creating new one with same name.
导致此错误的原因是针对新版本(2.5以后)的Ehcache,CacheManager使用了单例模式,当使用Spring Boot devtools开启热加载功能时,在加载SecurityManager Bean 对象实例时,会创建多个CacheManager实例,从而导致上述的异常。
? 在此之前,网上已给出很多的解决方案,如降低Ehcache版本,设置缓存shared属性等。那么,如何在不改变当前框架版本的情况下修复上述异常呢?下面是笔者的完整解决方案。
1.改造前的代码
? 下面的代码片段是改造前的示例:
在此示例中,只是简单的创建了ehcacheManager对象实例,并设置了缓存文件的存放地址。而新版本中,CacheManager要求是单例模式,因此需要使用EhCachManagerFactoryBean对象来限定cacheManager为共享模式。EhCachManagerFactoryBean是Spring提供的ehcache实现类。接下来我们看看如何改造。
2. 改造后的代码
? 修改的地方一共有三处,它们是:配置EhcacheManagerFactoryBean并设置其为共享模式,配置DefaultAdvisorAutoProxyCreator,让Spring 来管理Shiro的Bean生命周期,配置lifecycleBeanPostProcessor,并让DefaultAdvisorAutoProxyCreator依赖于此对象。
2.1 添加EhcacheManagerFactoryBean配置项
? 在原有的配置文件中添加EhcacheManagerFactoryBean配置项,并将shared属性设置为true,示例代码如下:
2.2 添加LifecycleBeanPostProcessor配置项
? 添加LifecycleBeanPostProcessor配置项,LifecycleBeanPostProcessor将统一管理Initializable和Destroyable的实现类,从而达到统一管理Shiro Bean的生命周期的目的。示例代码如下:
2.3 添加DefaultAdvisorAutoProxyCreator配置项
DefaultAdvisorAutoProxyCreator的作用是动态代理Shiro的事务,最终将事务交由Spring进行统一管理。此配置项需要依赖于LifecycleBeanPostProcessor。示例代码如下:
通过添加上述的三个配置项,在Spring Boot中开启热加载功能就可以避免Another CacheManager with same name的异常出现。
本文暂时没有评论,来添加一个吧(●'◡'●)