[英]How can I configure Ehcache 3 + spring boot + java config without xml?
我使用Ehcache 2 + spring boot
。 這是我的配置:
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
ehcache.xml - in resources.
現在我想使用Ehcache 3 + spring boot
和Java config而不是xml,但我還沒有找到任何例子。 我的問題:
1)為什么幾乎所有的例子都是基於xml 的? 這怎么能比java config更好呢?
2)如何在不使用xml的情況下在spring boot中使用java config配置Ehcache 3 ?
這是用於創建 Ehcache 管理器 bean 的等效 java 配置。
應用程序配置文件
@Configuration
@EnableCaching
public class ApplicationConfig {
@Bean
public CacheManager ehCacheManager() {
CachingProvider provider = Caching.getCachingProvider();
CacheManager cacheManager = provider.getCacheManager();
CacheConfigurationBuilder<String, String> configuration =
CacheConfigurationBuilder.newCacheConfigurationBuilder(
String.class,
String.class,
ResourcePoolsBuilder
.newResourcePoolsBuilder().offheap(1, MemoryUnit.MB))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(20)));
javax.cache.configuration.Configuration<String, String> stringDoubleConfiguration =
Eh107Configuration.fromEhcacheCacheConfiguration(configuration);
cacheManager.createCache("users", stringDoubleConfiguration);
return cacheManager;
}
}
服務實現程序
@Service
public class ServiceImpl {
@Cacheable(cacheNames = {"users"})
public String getThis(String id) {
System.out.println("Method called............");
return "Value "+ id;
}
}
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
我更喜歡使用 JAVA 配置而不是 XML 配置。 下面有兩個代碼示例,它們執行相同的邏輯但以不同的風格編寫。
XML 方法:
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.cache.support.CompositeCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import java.util.Collections;
@EnableCaching
@Configuration
public class CacheConfig {
@Primary
@Bean("cacheManager")
public CompositeCacheManager cacheManager() {
CompositeCacheManager compositeCacheManager = new CompositeCacheManager();
compositeCacheManager.setFallbackToNoOpCache(true);
compositeCacheManager.setCacheManagers(Collections.singleton(ehCacheManager()));
return compositeCacheManager;
}
@Bean("ehCacheManager")
public EhCacheCacheManager ehCacheManager() {
EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
ehCacheCacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject());
return ehCacheCacheManager;
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setShared(true);
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
return ehCacheManagerFactoryBean;
}
}
緩存文件
<ehcache name="custom_eh_cache">
<diskStore path="java.io.tmpdir"/>
<cache name="users"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LRU"/>
<cache name="roles"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
JAVA方法:
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.config.CacheConfiguration;
import net.sf.ehcache.config.DiskStoreConfiguration;
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.support.CompositeCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.util.Collections;
@EnableCaching
@Configuration
public class CacheConfig {
@Primary
@Bean("cacheManager")
public CompositeCacheManager cacheManager() {
CompositeCacheManager compositeCacheManager = new CompositeCacheManager();
compositeCacheManager.setFallbackToNoOpCache(true);
compositeCacheManager.setCacheManagers(Collections.singleton(ehCacheManager()));
return compositeCacheManager;
}
@Bean("ehCacheManager")
public EhCacheCacheManager ehCacheManager() {
EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager();
ehCacheCacheManager.setCacheManager(getCustomCacheManager());
return ehCacheCacheManager;
}
private CacheManager getCustomCacheManager() {
CacheManager cacheManager = CacheManager.create(getEhCacheConfiguration());
cacheManager.setName("custom_eh_cache");
cacheManager.addCache(createCache("users"));
cacheManager.addCache(createCache("roles"));
return cacheManager;
}
private Cache createCache(String cacheName) {
CacheConfiguration cacheConfig = new CacheConfiguration(cacheName, 1000)
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
.eternal(false)
.timeToLiveSeconds(3600)
.timeToIdleSeconds(3600);
return new Cache(cacheConfig);
}
private net.sf.ehcache.config.Configuration getEhCacheConfiguration() {
net.sf.ehcache.config.Configuration configuration = new net.sf.ehcache.config.Configuration();
DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration();
diskStoreConfiguration.setPath("java.io.tmpdir");
configuration.addDiskStore(diskStoreConfiguration);
return configuration;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.