問題1:兩個CacheManager 會報兩個相同的實現類錯誤
需要繼承CachingConfigurerSupport 重寫cacheManager方法,指定默認一個返回緩存提供者
@Configuration
@DependsOn({"springContextHolder","ehCacheCacheManager"})//這里是關鍵,要先初始化這兩個,因為下面用到了,只有DependsOn能實現,其它的嘗試都失敗
public class CacheConfigDefinition extends CachingConfigurerSupport {
/**
* 根據application 配置的緩存類型,返回自定義默認的緩存實現對象,如果不覆蓋這個方法根據順序返回
* @return
*/
@Override
public CacheManager cacheManager() {
if(Constant.CACHE_TYPE_REDIS.equals(ShiroConfig.cacheType)){
return SpringContextHolder.getBean(RedisCacheManager.class);
}else{
try{
return SpringContextHolder.getBean(EhCacheCacheManager.class);
}catch (Exception ex){
ex.printStackTrace();
}
}
return null;
}
}
另外配置RedisCacheManager和EhCacheCacheManager的類,需要明確指定EhCacheManagerFactoryBean、EhCacheCacheManager的@Bean方法,
public class CacheManagerConfig {
@Value("${spring.cache.ehcache.config}")
public String ehcacheConfig;
/**
* cacheManager名字
*/
public interface CacheManagerNames {
/**
* redis
*/
String REDIS_CACHE_MANAGER = "redisCacheManager";
/**
* ehCache
*/
String EHCACHE_CACHE_MAANGER = "ehCacheCacheManager";
}
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//設置序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om); // 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer); // key序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value序列化
redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // Hash value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 針對自動配置類型添加自己的Bean,它將取代默認的,網上大部分把redisTemplate寫在方法參數,但是行不通
* RedisTemplate帶泛型注入,需要指定名稱,不能按照默認的類型搜索,要根據名字裝配,拿出去什么變量用@Resource
* 管理緩存
* @return
*/
@Bean
public RedisCacheManager redisCacheManager() {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//設置redis緩存過期時間
//cacheManager.setDefaultExpiration(redisTimeout);
return cacheManager;
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
String path[] = ehcacheConfig.split(":");
ClassPathResource classPathResource = new ClassPathResource(path.length == 2 ? path[1] : ehcacheConfig);
cacheManagerFactoryBean.setConfigLocation(classPathResource);
cacheManagerFactoryBean.setShared(true);
return cacheManagerFactoryBean;
}
/**
* 創建ehCacheCacheManager
*/
@Bean
public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) {
return new EhCacheCacheManager(bean.getObject());
}
}
PS:碼雲springboot2.0通用權限系統腳手架同步更新 https://gitee.com/shenxingping/XPBoot
