此文章为转自他人博客
定义数据访问接口:
01 | package org.kevin.cache.dao; |
03 | import java.util.Collection; |
05 | import org.kevin.cache.domain.Data; |
07 | public interface DataDAO { |
09 | public void add(Data data); |
11 | public void update(Data data); |
13 | public Data find(Integer id); |
15 | public void delete(Integer id); |
17 | public Collection<Data> getAll(); |
对接口方法进行实现,使用Map模拟数据库的表进行存储数据:
01 | package org.kevin.cache.dao; |
03 | import java.util.Collection; |
04 | import java.util.HashMap; |
07 | import org.kevin.cache.domain.Data; |
08 | import org.springframework.cache.annotation.CacheEvict; |
09 | import org.springframework.cache.annotation.Cacheable; |
11 | public class DataDAOImpl implements DataDAO { |
13 | private Map<Integer, Data> dataMap = new HashMap<>(); |
16 | @CacheEvict (value = "data" , allEntries = true ) |
17 | public void add(Data data) { |
18 | System.out.println( "Execute:public void add(Data data)" ); |
19 | dataMap.put(data.getId(), data); |
23 | @CacheEvict (value = "data" , allEntries = true ) |
24 | public void update(Data data) { |
25 | System.out.println( "Execute:public void update(Data data) " ); |
26 | dataMap.put(data.getId(), data); |
30 | @Cacheable (value = "data" ) |
31 | public Data find(Integer id) { |
32 | System.out.println( "Execute:public Data find(Integer id)" ); |
33 | return dataMap.get(id); |
37 | @CacheEvict (value = "data" , allEntries = true ) |
38 | public void delete(Integer id) { |
39 | System.out.println( "Execute:public void delete(Integer id)" ); |
44 | @Cacheable (value = "data" ) |
45 | public Collection<Data> getAll() { |
46 | System.out.println( "Execute:public Collection<Data> getAll()" ); |
47 | return dataMap.values(); |
如上,对数据进行增删改的时候清空缓存,查询时使用缓存。其中value为缓存区,allEntries表示清空缓存区中的所有数据。为了稍后验证缓存是否生效,打印出执行的方法签名。
定义领域模型:
01 | package org.kevin.cache.domain; |
07 | private String second; |
09 | public Data(Integer id, String first, String second) { |
15 | public String getFirst() { |
19 | public void setFirst(String first) { |
23 | public String getSecond() { |
27 | public void setSecond(String second) { |
31 | public void setId(Integer id) { |
35 | public Integer getId() { |
接下来编写spring配置文件:
01 | < beans xmlns = "http://www.springframework.org/schema/beans" |
02 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p" |
03 | xmlns:cache = "http://www.springframework.org/schema/cache" |
05 | http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd |
06 | http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd"> |
08 | < cache:annotation-driven /> |
10 | < bean id = "cacheManager" class = "org.springframework.cache.support.SimpleCacheManager" > |
11 | < property name = "caches" > |
13 | < bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "default" /> |
14 | < bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "data" /> |
19 | < bean id = "dataDao" class = "org.kevin.cache.dao.DataDAOImpl" /> |
最后编写main方法验证缓存是否生效:
01 | package org.kevin.cache; |
03 | import java.util.Collection; |
05 | import org.kevin.cache.dao.DataDAO; |
06 | import org.kevin.cache.domain.Data; |
07 | import org.springframework.context.support.ClassPathXmlApplicationContext; |
09 | public class CacheMain { |
11 | public static void main(String[] args) { |
13 | ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "spring-cache-demo.xml" ); |
14 | DataDAO dataDAO = context.getBean( "dataDao" , DataDAO. class ); |
16 | dataDAO.add( new Data( 1 , "li" , "wenkai" )); |
17 | Collection<Data> dataCollection = dataDAO.getAll(); |
18 | System.out.println(dataCollection.size()); |
20 | System.out.println( "=================================" ); |
22 | dataDAO.add( new Data( 2 , "jack" , "lee" )); |
23 | dataCollection = dataDAO.getAll(); |
24 | System.out.println(dataCollection.size());; |
25 | Data data = dataDAO.find( 1 ); |
26 | System.out.println(data.getFirst()); |
27 | data = dataDAO.find( 2 ); |
28 | System.out.println(data.getFirst()); |
29 | data = dataDAO.find( 2 ); |
30 | System.out.println(data.getFirst());; |
32 | System.out.println( "====================================" ); |
33 | dataDAO.add( new Data( 3 , "kevin" , "lee" )); |
34 | data = dataDAO.find( 2 ); |
35 | System.out.println(data.getFirst()); |
36 | data = dataDAO.find( 3 ); |
37 | System.out.println(data.getFirst()); |
38 | data = dataDAO.find( 2 ); |
39 | System.out.println(data.getFirst()); |
打印接过如下,表示已经生效:
01 | Execute:public void add(Data data) |
02 | Execute:public Collection< Data > getAll() |
04 | ================================= |
05 | Execute:public void add(Data data) |
06 | Execute:public Collection< Data > getAll() |
08 | Execute:public Data find(Integer id) |
10 | Execute:public Data find(Integer id) |
13 | ==================================== |
14 | Execute:public void add(Data data) |
15 | Execute:public Data find(Integer id) |
17 | Execute:public Data find(Integer id) |
最后,spring支持的缓存机制,是方法级的缓存,而不关注底层是否使用了数据库以及通过什么方式访问的数据库;因此这种缓存不止可以放到DAO层,也可以放置到Service层,甚至可以对各种代码数据进行缓存。
如果应用中同时使用了Hibernate和Ibatis,或者这种方式是一种好的缓存解决方案。