spring中添加google的guava缓存(demo)
Posted psy-code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring中添加google的guava缓存(demo)相关的知识,希望对你有一定的参考价值。
1.pom文件中配置
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> </dependency> </dependencies>
2.GuavaCacheManagerConfig配置类
package com.zy; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Maps; import org.springframework.cache.Cache; import org.springframework.cache.guava.GuavaCache; import org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentMap; public class GuavaCacheManagerConfig extends AbstractTransactionSupportingCacheManager { private final ConcurrentMap<String, Cache> cacheMap = Maps.newConcurrentMap(); private Map<String, CacheBuilder> builderMap = Maps.newHashMap(); @Override protected Collection<? extends Cache> loadCaches() { return cacheMap.values(); } //获取缓存单例 @Override public Cache getCache(String name) { Cache cache = this.cacheMap.get(name); if (null == cache) { synchronized (this.cacheMap) { cache = this.cacheMap.get(name); if (null == cache && this.builderMap.containsKey(name)) { CacheBuilder builder = this.builderMap.get(name); cache = createGuavaCache(name, builder); this.cacheMap.put(name, cache); } } } return cache; } private Cache createGuavaCache(String name, CacheBuilder builder) { com.google.common.cache.Cache<Object, Object> cache; if(builder == null){ cache = CacheBuilder.newBuilder().build(); }else{ cache = builder.build(); } return new GuavaCache(name, cache, isAllowNullValues()); } private boolean isAllowNullValues() { return true; } //配置中多组缓存池注入 public void setConfigMap(Map<String, CacheBuilder> configMap) { this.builderMap = configMap; } }
3.applicationContext-cache-guava.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!-- 1.将需要加入缓存的类注册进来 --> <bean id="guavaService" class="com.zy.GuavaServiceImpl"/> <!-- ==========================2.开启guava缓存开始==================== --> <!-- 声明缓存注解的开启 --> <cache:annotation-driven cache-manager="cacheManager" proxy-target-class="true"/> <!-- 声明使用spring管理缓存组 --> <bean id="cacheManager" class="org.springframework.cache.support.CompositeCacheManager"> <property name="cacheManagers"> <list> <ref bean="guavaCacheManager"/> </list> </property> <property name="fallbackToNoOpCache" value="true"/> </bean> <!-- 缓存的创建的具体实现类注入 class为自定义的类 --> <bean id="guavaCacheManager" class="com.zy.GuavaCacheManagerConfig"> <!-- 此处可以配置一组缓存池对应不同的业务类型 这里实现了一个"guava"的默认缓存并构建 --> <property name="configMap"> <map key-type="java.lang.String" value-type="com.google.common.cache.CacheBuilder"> <!-- 该缓存与service层实现类上注解上的value相等 --> <entry key="guava" value-ref="defaultCacheBuilder"/> </map> </property> </bean> <!-- 此处直接构建"guava"默认缓存 --> <bean id="defaultCacheBuilder" class="com.google.common.cache.CacheBuilder" factory-method="from"> <!-- 缓存池大小 时间(定时回收 缓存项在给定时间内没有被‘写‘访问 回收 还有refreshAfterWrite expireAfterAccess可供使用) 当然还有一些其他可选组件(weakKeys,removalListener and so on!) --> <constructor-arg value="maximumSize=10000, expireAfterAccess=5s"/> </bean> <!-- ==========================2.开启guava缓存结束==================== --> </beans>
4.GuavaDTO
package com.zy; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class GuavaDTO { private Integer id; private String name; }
5.GuavaServiceImpl的实现类
package com.zy; import org.springframework.cache.annotation.Cacheable; public class GuavaServiceImpl { // spring EL // GuavaDTO 普通的DTO // @Cacheable(value = "guava", key = "‘testGuavaCache:‘ + #guavaDTO.id + #guavaDTO.name") // value 为配置文件中的缓存池名称 key 为键名 @Cacheable(value = "guava", key = "‘testGuavaCache:‘ + #guavaDTO.id + #guavaDTO.name") public void testGuavaCache(GuavaDTO guavaDTO) { System.out.println("=======缓存中没有,进入方法来查询了========="); } }
如果service的实现类是删除方法,则在方法上,加上@CacheEvict注解
如果service的实现类是更新方法,则在方法上,加上@CachePut注解(每次执行,都会进入方法)
6.测试类GuavaTest
package com.zy; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class GuavaTest { @Test public void fn() throws InterruptedException { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-cache-guava.xml"); GuavaServiceImpl guavaService = (GuavaServiceImpl) applicationContext.getBean("guavaService"); System.out.println("第1次访问:1号tom=========================="); guavaService.testGuavaCache(new GuavaDTO(1, "tom")); System.out.println("第2次访问:1号tom=========================="); guavaService.testGuavaCache(new GuavaDTO(1, "tom")); guavaService.testGuavaCache(new GuavaDTO(1, "tom")); System.out.println("第1次访问:2号jerry=========================="); guavaService.testGuavaCache(new GuavaDTO(2, "jerry")); Thread.sleep(5000); /** * 此时配置文件中的失效时间是5000ms * */ System.out.println("第3次访问:1号tom=========================="); guavaService.testGuavaCache(new GuavaDTO(1, "tom")); } }
7.测试结果如下:
以上是关于spring中添加google的guava缓存(demo)的主要内容,如果未能解决你的问题,请参考以下文章