spring-boot(六)缓存配置

分类:spring-boot
阅读:828
作者:majingjing
发布:2016-12-25 12:14

这篇文章主要介绍下spring-boot如何集成缓存。 java的缓存框架有很多种,官方也都给了很多缓存的支持。 微信截图_20161225114733.png

官方的这些缓存想必大家在项目中多多少少都有接触到。 由于ehcache3.x实现了jsr-107的标准接口,这里我主要介绍spring-boot下的JCache (JSR-107) 和EhCache 3的集成整合。

案例代码在 “spring-boot(五)自定义属性配置” 的基础上改造

项目结构图 微信截图_20161225115334.png

1。 在pom中引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
	<groupId>javax.cache</groupId>
	<artifactId>cache-api</artifactId>
</dependency>
<dependency>
	<groupId>org.ehcache</groupId>
	<artifactId>ehcache</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
	<scope>test</scope>
</dependency>

2。在 src/man/resources 目录下建立 ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<config
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
  xmlns='http://www.ehcache.org/v3'
  xsi:schemaLocation="
        http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.1.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.1.xsd">

  <cache-template name="heap-cache">
    <resources>
      <heap unit="entries">2000</heap> 
      <offheap unit="MB">100</offheap> 
    </resources>
  </cache-template>

  <cache alias="Hello" uses-template="heap-cache">
    <expiry>
      <ttl unit="seconds">3</ttl>
    </expiry>
  </cache> 

</config>

这里特别注意下ehcahce2.x和ehcahce3的配置是不同的,这也是我选择讲3的一个原因吧

3。 在service层增加缓存 (@CacheConfig,@Cacheable

@Service
@CacheConfig(cacheNames = "Hello")
public class HelloService {
	private Logger log = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	Dao dao;

	@Cacheable
	public List<HelloBean> queryHellos() {
		log.info("查询了数据库");
		List<HelloBean> hellos = dao.queryForList(HelloBean.class, "select * from hello ");
		return hellos;
	}

	public HelloBean queryHello(Integer id) {
		HelloBean hello = dao.queryForObject(HelloBean.class, "select * from hello where id = ? ", id);
		return hello;
	}
}

在这里特别说明下,之前的代码 HelloBean 类没有序列化,缓存的存储是需要对象序列化的,所以 修改代码片段 public class HelloBean implements Serializable{

4。 在主启动类上增加启用缓存的注解 @EnableCaching

@EnableCaching
@SpringBootApplication
public class MainApplication {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(MainApplication.class, args);
	}

}

5。 在 application.properties 中指定缓存的配置文件路径

spring.cache.jcache.config=classpath:ehcache.xml

到此缓存配置已经搭建完成,下面我们写个单元测试来看下效果。 在目录 src/test/java 下建立单元测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MainApplication.class)
public class MyTest {

	private Logger log = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	private CacheManager cacheManager;
	
	@Autowired
	HelloService service;

	@Before
	public void before() {
		log.info("cacheManager {}", cacheManager);
	}

	@Test
	public void cache() throws InterruptedException {
		log.info("访问了 {} 接口 , 现在时间为 {} ", "service.queryHellos()", new Date());
		service.queryHellos();
		log.info("访问了 {} 接口 , 现在时间为 {} ", "service.queryHellos()", new Date());
		service.queryHellos();
		
		Thread.sleep(5000);
		
		log.info("访问了 {} 接口 , 现在时间为 {} ", "service.queryHellos()", new Date());
		service.queryHellos();
	}

}

运行测试类,观察控制台输出

微信截图_20161225121128.png 同时我们也会看到缓存使用的是ehcache来管理的。

源代码附件: my-springboot-6.tar.gz