Spring学习-缓存

提到缓存,能想到什么?一级缓存、二级缓存、web缓存、redis。所有的缓存无非在宣扬一个优势,那就是快,无需反复查询等。今天讲讲Spring缓存如何实现。

如何实现?

1、声明启用缓存,添加缓存管理器

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:cache="http://www.springframework.org/schema/cache"
 4        xmlns:p="http://www.springframework.org/schema/p"
 5        xsi:schemaLocation="http://www.springframework.org/schema/beans
 6     http://www.springframework.org/schema/beans/spring-beans.xsd
 7      http://www.springframework.org/schema/cache
 8      http://www.springframework.org/schema/cache/spring-cache.xsd">
 9 
10     <cache:annotation-driven />
11 
12     <bean id="personService" class="com.jackie.service.PersonService" />
13 
14     <!-- generic cache manager -->
15     <bean id="cacheManager"
16           class="org.springframework.cache.support.SimpleCacheManager">
17         <property name="caches">
18             <set>
19                 <bean
20                         class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
21                         p:name="default" />
22 
23                 <bean
24                         class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
25                         p:name="personCache" />
26             </set>
27         </property>
28     </bean>
29 </beans>

第10行作用:启用缓存。

15~28行:添加缓存管理器。

编写需要缓存的方法:1、创建一个测试bean  Person对象  2、准备需要缓存的接口方法

 1 @Component
 2 public class Person {
 3 
 4     private int id;
 5     private int age;
 6     private String name;
 7 
 8     public int getId() {
 9         return id;
10     }
11 
12     public void setId(int id) {
13         this.id = id;
14     }
15 
16     public int getAge() {
17         return age;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     @Override
33     public String toString() {
34         return "Person{" +
35                 "id=" + id +
36                 ", age=" + age +
37                 ", name='" + name + '\'' +
38                 '}';
39     }
40 }

准备需要缓存的接口方法

 1 @Service("personService")
 2 public class PersonService {
 3 
 4     @Cacheable(value = "personCache")
 5     public Person findPerson(int i) {
 6         System.out.println("real query person object info");
 7 
 8         Person person = new Person();
 9         person.setId(i);
10         person.setAge(18);
11         person.setName("Jackie");
12         return person;
13     }
14 
15 }
@Cacheable:主要用来配置方法,能够根据方法和请求参数对结果进行缓存,当调用相同参数的方法时,本身不会被调用,取而代之的是直接从返回中找到并返回,简言之,就是缓存中有就取出,没有就执行方法。


既然有缓存的过程,就有删除缓存的过程。@CacheEvict

  
1     @CacheEvict(value = "personCache", key = "#person.getId()")
2     public void updatePerson(Person person) {
3         System.out.println("update: " + person.getName());
4     }
5 
6     @CacheEvict(value = "personCache", allEntries = true)
7     public void reload() {
8 
9     }

第1行的意思是:当updatePerson被调用时,会根据key来取出相应的缓存记录,并删除。

第6行的意思是:在调用reload方法时,会清空所有的缓存记录。

 


posted @ 2017-09-25 15:15  vvning  阅读(162)  评论(0编辑  收藏  举报