복붙노트

[SPRING] XML없이 Spring 4에서 EhCache 사용하기

SPRING

XML없이 Spring 4에서 EhCache 사용하기

Spring 4 또는 Spring Boot에서 xml없이 EhCache를 초기화하는 방법이 있습니까?

나는 Spring Boot 1.0.0.RC3에 ehcache 의존성이 없지만 Spring 4.0GA 릴리스 포스트는 EhCache에 대한 지원이 향상되었다고 언급했다. 또한 Spring 3에는 org.springframework.cache.ehcache.EhCacheCacheManager 클래스가 있지만 더 이상 종속성의 일부가 아닙니다.

편집하다: Spring 4는 EhCache를 지원합니다. 종속성을 추가해야합니다.

<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>

편집 2 : 나는 다음과 같은 시도를했고 가까이 있다고 생각하지만 오류가 발생했습니다 :

@Bean
@Override
public CacheManager cacheManager() {
    CacheConfiguration cacheConfiguration = new CacheConfiguration();
    cacheConfiguration.setName("primary");
    cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
    cacheConfiguration.setMaxEntriesLocalHeap(0);

    net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
    config.addCache(cacheConfiguration);

    net.sf.ehcache.CacheManager cacheManager = new net.sf.ehcache.CacheManager(config);
    cacheManager.setName("EhCache");

    return new EhCacheCacheManager(cacheManager);
}

@Bean
public EhCacheManagerFactoryBean factoryBean() {
    return new EhCacheManagerFactoryBean();
}

오류

Caused by: net.sf.ehcache.CacheException: Another unnamed CacheManager 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.
The source of the existing CacheManager is: [Programmatically configured]
    at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.java:590)
    at net.sf.ehcache.CacheManager.init(CacheManager.java:384)
    at net.sf.ehcache.CacheManager.<init>(CacheManager.java:263)
    at org.springframework.cache.ehcache.EhCacheManagerFactoryBean.afterPropertiesSet(EhCacheManagerFactoryBean.java:166)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
    ... 15 more

해결법

  1. ==============================

    1.Spring에서 XML없는 EhCache 설정

    Spring에서 XML없는 EhCache 설정

    @Configuration
    @EnableCaching
    public class CachingConfig implements CachingConfigurer {
        @Bean(destroyMethod="shutdown")
        public net.sf.ehcache.CacheManager ehCacheManager() {
            CacheConfiguration cacheConfiguration = new CacheConfiguration();
            cacheConfiguration.setName("myCacheName");
            cacheConfiguration.setMemoryStoreEvictionPolicy("LRU");
            cacheConfiguration.setMaxEntriesLocalHeap(1000);
    
            net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
            config.addCache(cacheConfiguration);
    
            return net.sf.ehcache.CacheManager.newInstance(config);
        }
    
        @Bean
        @Override
        public CacheManager cacheManager() {
            return new EhCacheCacheManager(ehCacheManager());
        }
    
        @Bean
        @Override
        public KeyGenerator keyGenerator() {
            return new SimpleKeyGenerator();
        }
    
        @Bean
        @Override
        public CacheResolver cacheResolver()    {
            return new SimpleCacheResolver();
        }
    
        @Bean
        @Override
        public CacheErrorHandler errorHandler() {
             return new SimpleCacheErrorHandler();
        }
    }
    

    또는 테스팅을 위해 아래와 같이 XML없이 실행되는 간단한 ConcurrentMapCache를 사용할 수 있습니다.

    @Configuration
    @EnableCaching
    public class CachingConfig implements CachingConfigurer {
        @Bean
        @Override
        public CacheManager cacheManager() {
            SimpleCacheManager cacheManager = new SimpleCacheManager();
    
            List<Cache> caches = new ArrayList<Cache>();
            caches.add(new ConcurrentMapCache("myCacheName"));
            cacheManager.setCaches(caches);
    
            return cacheManager;
        }
    
        @Bean
        @Override
        public KeyGenerator keyGenerator() {
            return new SimpleKeyGenerator();
        }
    
        @Bean
        @Override
        public CacheResolver cacheResolver()    {
            return new SimpleCacheResolver();
        }
    
        @Bean
        @Override
        public CacheErrorHandler errorHandler() {
             return new SimpleCacheErrorHandler();
        }
    }
    

    편집 : 기본 캐시에 종료 방법을 추가하도록 업데이트되었습니다. 편집 : 오류 처리기 및 캐시 해결 프로그램에 대한 추가 된 구성

  2. ==============================

    2.필자는 두 가지 추상화 수준, 기술 별 구성 파일 (Ehcache, Redis 등) 및 일반 구성 파일에서이 작업을 수행합니다.

    필자는 두 가지 추상화 수준, 기술 별 구성 파일 (Ehcache, Redis 등) 및 일반 구성 파일에서이 작업을 수행합니다.

    Ehcache (Redis는 비슷할 것입니다)를위한 것입니다 :

    @Configuration
    public class EhCacheConfiguration {
    
        @Bean
        public EhCacheCacheManager ehCacheCacheManager() {
    
            return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
        }
    
    
        @Bean
        public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
    
            EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
    
            cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            cacheManagerFactoryBean.setShared(true);
    
            return cacheManagerFactoryBean;
        }
    }
    

    그리고 여기에 일반적인 하나가 있습니다 (Redis 후크로 완성 됨) :

    @Configuration
    @EnableCaching
    public class CachingConfiguration implements CachingConfigurer {
    
        @Qualifier("ehCacheCacheManager")
        @Autowired(required = false)
        private CacheManager ehCacheCacheManager;
    
        @Qualifier("redisCacheManager")
        @Autowired(required = false)
        private CacheManager redisCacheManager;
    
    
        @Bean
        @Override
        public CacheManager cacheManager() {
    
            List<CacheManager> cacheManagers = Lists.newArrayList();
    
            if (this.ehCacheCacheManager != null) {
                cacheManagers.add(this.ehCacheCacheManager);
            }
    
            if (this.redisCacheManager != null) {
                cacheManagers.add(this.redisCacheManager);
            }
    
            CompositeCacheManager cacheManager = new CompositeCacheManager();
    
            cacheManager.setCacheManagers(cacheManagers);
            cacheManager.setFallbackToNoOpCache(false);
    
            return cacheManager;
        }
    
    
        @Bean
        @Override
        public KeyGenerator keyGenerator() {
    
            return new DefaultKeyGenerator();
        }
    }
    
  3. from https://stackoverflow.com/questions/21944202/using-ehcache-in-spring-4-without-xml by cc-by-sa and MIT license