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方法时,会清空所有的缓存记录。
岁月本长而忙者自促;天地本宽而卑者自隘;风花雪月本闲,而劳忧者自冗;天行健,君子以自强不息;地势坤,君子以厚德载物;宠辱不惊,闲看庭前花开花落;去留无意,漫随天外云卷云舒.不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安