Springboot ehcache/redis雙緩存問題


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM