问题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