问题
Following the spring documentation about cache I could use cache on my project, but how can I configure guava to define a expired time or size per cache name?
applicationConfig.xml
<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager"/>
Foo.java
@Cacheable(value="courses", key="#user.id")
public List<Course> getCoursesByUser(User user) {
...
}
回答1:
You can configure caches separately. See Spring Guava cache
@Bean
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
GuavaCache bookCache = new GuavaCache("book", CacheBuilder.newBuilder().build());
GuavaCache booksExpirableCache = new GuavaCache("books", CacheBuilder.newBuilder()
.expireAfterAccess(30, TimeUnit.MINUTES)
.build());
simpleCacheManager.setCaches(Arrays.asList(bookCache, booksExpirableCache));
return simpleCacheManager;
}
回答2:
You can specify CacheBuilder for your GuavaCacheManager in your Spring configuration
- In case of Java configuration it can look like this:
@Bean
public CacheManager cacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager();
cacheManager.setCacheBuilder(
CacheBuilder.
newBuilder().
expireAfterWrite(2, TimeUnit.SECONDS).
maximumSize(100));
return cacheManager;
}
- In case of XML configuration, you can use CacheBuilderSpec in guava
<bean id="legendaryCacheBuilder"
class="com.google.common.cache.CacheBuilder"
factory-method="from">
<constructor-arg value="maximumSize=42,expireAfterAccess=10m,expireAfterWrite=1h" />
</bean>
For more information look at:
http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilderSpec.html
Injecting Google guava cache builder into bean via Spring
回答3:
In another way
XML
<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
<property name="cacheBuilderSpec">
<bean class="com.google.common.cache.CacheBuilderSpec" factory-method="parse">
<constructor-arg name="cacheBuilderSpecification" value="expireAfterWrite=55m"/>
</bean>
</property>
</bean>
Java
@Cacheable(value = "tokenValue", cacheManager = "cacheManager")
回答4:
I think that @mavarazy answer is the best. I only add if you need you own automatic missed cache configuration you could do it on the following way.
First define you own cache manager which creates automatically cache if you need it:
public class MyCacheManager extends SimpleCacheManager {
@Override
protected Cache getMissingCache(String name) {
// or different cache config if you need
return new GuavaCache(name, CacheBuilder.newBuilder().maximumSize(250).expireAfterWrite(10, TimeUnit.MINUTES).build());
}
}
And now you can define cache manager configuration:
@Bean
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new MyCacheManager();
GuavaCache specificCacheConfig = new GuavaCache("specificCacheConfigName",
CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.MINUTES).build());
simpleCacheManager.setCaches(Collections.singletonList(specificCacheConfig));
return simpleCacheManager;
}
来源:https://stackoverflow.com/questions/28296839/config-spring-cache-using-guava