Config Spring cache using Guava

耗尽温柔 提交于 2019-12-22 04:01:32

问题


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

  1. 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;
}
  1. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!