`

spring 3.1中的cache小结

 
阅读更多

spring 3.1中有cache了,下面结合目前网上的一些资料和手册的归纳总结下: 

1 @cache注解 
   在3.1中,都是用注解的了, 
@Cacheable注解可以用在方法或者类级别。当他应用于方法级别的时候,就是如上所说的缓存返回值了。当应用在类级别的时候,这个类的所有方法的返回值都将被缓存。 
 

Java代码   收藏代码
  1. @Cacheable(value = "employee")  
  2. public class EmployeeDAO {  
  3.   
  4.   public Person findEmployee(String firstName, String surname, int age) {  
  5.   
  6.     return new Person(firstName, surname, age);  
  7.   }  
  8.   
  9.   public Person findAnotherEmployee(String firstName, String surname, int age) {  
  10.   
  11.     return new Person(firstName, surname, age);  
  12.   }  
  13. }  


   在上面的代码中,缓存了Person了,命名为employee,缓存的是方法的值, 
@Cacheable注解有三个参数,value是必须的,还有key和condition。第一个参数,也就是value指明了缓存将被存到什么地方。 
    在spring 3.1中,可以使用spel表达式去进行缓存的指定,比如: 

 

Java代码   收藏代码
  1. @Cacheable(value = "employee", key = "#surname")  
  2.   public Person findEmployeeBySurname(String firstName, String surname, int age) {  
  3.   
  4.     return new Person(firstName, surname, age);  
  5.   }  


  这里注意指定的缓存的是根据key=surename。也可以指定表达式 

Java代码   收藏代码
  1. @Cacheable(value = "employee", condition = "#age < 25")  
  2.   public Person findEmployeeByAge(String firstName, String surname, int age) {  
  3.   
  4.     return new Person(firstName, surname, age);  
  5.   }  


   这里指定age<25的才缓存; 
  接下来看下如何应用,比如: 

Java代码   收藏代码
  1. @Test  
  2.   public void testCache() {  
  3.   
  4.     Person employee1 = instance.findEmployee("John""Smith"22);  
  5.     Person employee2 = instance.findEmployee("John""Smith"22);  
  6.   
  7.     assertEquals(employee1, employee2);  
  8.   }  


     这个时候肯定是相等的了,因为用的是缓存。但是如果调用的是 
findEmployeeBySurname方法的话,就一定有点不同了, 

Java代码   收藏代码
  1. @Test  
  2.   public void testCacheOnSurnameAsKey() {  
  3.   
  4.     Person employee1 = instance.findEmployeeBySurname("John""Smith"22);  
  5.     Person employee2 = instance.findEmployeeBySurname("Jack""Smith"55);  
  6.   
  7.     assertEquals(employee1, employee2);  
  8.   }  


  但由于是缓存的是根据surename为key,所以上面结果两个对象却依然是相等的(尽管原本看上去是不同的对象了),所以key的选择一定要小心。 

  继续单元测试: 
 

Java代码   收藏代码
  1. @Test  
  2.   public void testCacheWithAgeAsCondition() {  
  3.   
  4.     Person employee1 = instance.findEmployeeByAge("John""Smith"22);  
  5.     Person employee2 = instance.findEmployeeByAge("John""Smith"22);  
  6.   
  7.     assertEquals(employee1, employee2);  
  8.   }  


    这两个就一样了,因为都是age<25的,都缓存了,指向同一个对象。 


2 取消缓存 
   下面看下如何取消缓存 
  @CacheEvict 

Java代码   收藏代码
  1. @CacheEvict(value = "employee", allEntries = true)  
  2. public void resetAllEntries() {  
  3.   
  4. }  


   使用@CacheEvict去取消缓存, 

@CacheEvict支持如下几个参数: 

value:缓存位置名称,不能为空,同上 

key:缓存的key,默认为空,同上 

condition:触发条件,只有满足条件的情况才会清除缓存,默认为空,支持SpEL 

allEntries:true表示清除value中的全部缓存,默认为false 
  当然,也可以@cahceable和@cacheEvict一起使用,比如: 

Java代码   收藏代码
  1. @CacheEvict(value = "employee", beforeInvocation = true)  
  2. @Cacheable(value = "employee")  
  3. public Person evictAndFindEmployee(String firstName, String surname, int age) {  
  4.   
  5.   return new Person(firstName, surname, age);  
  6. }  


  

Java代码   收藏代码
  1. @Test  
  2. public void testBeforeInvocation() {  
  3.   
  4.   Person employee1 = instance.evictAndFindEmployee("John""Smith"22);  
  5.   Person employee2 = instance.evictAndFindEmployee("John""Smith"22);  
  6.   
  7.   assertNotSame(employee1, employee2);  
  8. }  


   这里的话,先使用@CacheEvict(value = "employee", beforeInvocation = true), 
会先清掉所有缓存,所以asset的结果就不相等了; 
  

3 如何配置 
   .spring-cache 

首先我们来看一下如何使用spring3.1自己的cache, 

需要在命名空间中增加cache的配置 

Java代码   收藏代码
  1. beans xmlns="http://www.springframework.org/schema/beans"    
  2.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"    
  3.     xmlns:cache="http://www.springframework.org/schema/cache"    
  4.    xsi:schemaLocation="    
  5.            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
  6.           http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">    



Java代码   收藏代码
  1.  <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->    
  2. <cache:annotation-driven cache-manager="cacheManager"/>    
  3.     
  4.     
  5. <!-- spring自己的换管理器,这里定义了两个缓存位置名称 ,既注解中的value -->    
  6. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">    
  7.     <property name="caches">    
  8.        <set>    
  9.           <bean    
  10.                class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"    
  11.                 p:name="default" />    
  12.             <bean    
  13.                 class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"    
  14.                 p:name="andCache" />    
  15.        </set>      </property>    
  16. </bean>     

 

 

 

@Cacheable(value = "andCache", key ="#surname",condition = "#age < 25 and #firstName=='two' ")  

public Person findEmployeeByAge(String firstName, String surname, int age) {  

分享到:
评论

相关推荐

    Spring 3.1 jar包

    在AOP(面向切面编程)方面,Spring 3.1 提供了对JSR-250注解的完全支持,如@PostConstruct和@PreDestroy,这些注解可以在方法上使用,以便在bean的生命周期中定义初始化和销毁行为。同时,改进了代理模型,支持...

    spring 3.1的 源码

    在Spring 3.1中,依赖注入进一步优化,支持更多的注解类型,如`@Autowired`、`@Qualifier`等,使得代码更加简洁、可读性强。 2. **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring的AOP模块提供了声明...

    spring3.1源码包

    在Spring 3.1中,AOP模块有了显著的提升。面向切面编程允许开发者将关注点分离,例如日志记录、事务管理等,这些都可以作为独立的“切面”进行处理。3.1版本引入了基于注解的切入点表达式,使得切面定义更加简洁直观...

    spring3.1 jar全集

    在这个"spring3.1 jar全集"中,我们包含了Spring的核心组件和其他关键模块,如AOP(面向切面编程)和Beans模块。 首先,让我们深入了解一下Spring Core。这是Spring框架的基础,提供了依赖注入(DI)和控制反转...

    最新 spring3.1 完整jar包

    在这个“最新 spring3.1 完整jar包”中,包含了Spring框架的所有核心组件和其他相关模块,确保了开发环境的完备性。 1. **核心容器**:Spring的核心在于其IoC(Inversion of Control)容器,它负责管理应用对象的...

    spring3.1相关配置文件

    在这个压缩包中,我们很可能会找到与Spring 3.1配置相关的各种文件,如XML配置文件、Java配置类以及相关文档。 1. **Spring核心**:Spring的核心特性包括依赖注入(Dependency Injection,DI)和面向切面编程...

    spring3.1需要的jar包

    标题中的“spring3.1需要的jar包”指的是在使用Spring框架版本3.1时所需的外部依赖库。Spring是一个开源的Java平台,它为构建企业级应用提供了全面的框架支持,包括依赖注入(DI),面向切面编程(AOP),以及用于...

    spring3.1完整包

    这个"spring3.1完整包"包含了Spring框架的多个核心模块,下面将详细介绍这些模块及其功能。 1. **org.springframework.context-3.1.0.M1.jar**:这是Spring上下文模块,提供了容器的核心功能,包括Bean的定义、配置...

    Spring 3.1 Cache Abstraction Tutorial

    Spring框架从3.1版本开始引入了强大的缓存抽象,使得开发者能够轻松地在应用程序中集成缓存功能。本教程将深入探讨Spring 3.1的缓存抽象,帮助你理解其核心概念和实现方式。 1. **缓存抽象的概念** Spring 3.1的...

    spring3.1所需的全部jar包

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)能力而著名。Spring 3.1是该框架的一个重要版本,它引入了许多增强...

    spring3.1 官方全部jar包

    spring3.1官方所有的jar包 org.springframework.aop-3.1.RELEASE.jar org.springframework.asm-3.1.RELEASE.jar org.springframework.aspects-3.1.RELEASE.jar org.springframework.beans-3.1.RELEASE.jar org....

    spring3.1开发宝典

    spring3.1最新版本的开发宝典,内容详解!

    Spring3.1AOP简单例子

    在本示例中,我们将深入探讨Spring框架的3.1版本中的核心概念之一:面向切面编程(Aspect-Oriented Programming,简称AOP)。AOP是Spring框架的强大特性,它允许我们在应用程序中实现关注点的分离,使得我们可以将横...

    Spring3.1 AOP倚赖jar 包汇总

    Spring 3.1是Spring框架的一个重要版本,它在企业级Java应用开发中扮演着核心角色。AOP(面向切面编程)是Spring框架的重要特性,允许开发者将关注点分离,比如日志、事务管理等,从核心业务逻辑中解耦出来。本...

    spring3.1+xfire1.26

    在"spring3.1+xfire1.26 全注解"这个项目中,开发者利用Spring 3.1的注解特性来配置和管理应用程序组件,以及XFire 1.26来处理Web服务的创建和交互。全注解意味着不再需要XML配置文件,而是直接在Java类和方法上使用...

    Spring3.1 MongoDB整合实例(含jar包)已测

    本文将深入探讨如何在Spring 3.1版本中整合MongoDB,以及提供的jar包资源。 首先,Spring 3.1对MongoDB的支持主要体现在Spring Data MongoDB项目中,它提供了一套完整的抽象层,简化了与MongoDB的交互。Spring Data...

    Spring3.1 中文参考文档

    Spring3.1 中文参考文档,可以参考下

    spring 3.1中文文档

    spring 中文开发文档 spring 3.1

    spring3.1 struts2.3 hibernate4.1 jpa集成小例子

    这个"spring3.1 struts2.3 hibernate4.1 jpa集成小例子"是一个典型的Java Web项目,它展示了如何将Spring 3.1、Struts 2.3、Hibernate 4.1和Java Persistence API (JPA) 这四大组件融合到一个应用中。接下来,我们将...

Global site tag (gtag.js) - Google Analytics