問題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