`
hanqunfeng
  • 浏览: 1543108 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring3.1 Cache注解

阅读更多

需要感慨一下,spring3.0时丢弃了2.5时的spring-modules-cache.jar,致使无法使用spring来方便的管理cache注解,好在3.1.M1中增加了对cache注解的支持,可喜可贺啊!

 

希望了解spring2.5的cache注解,可以参考如下内容:

Spring基于注解的缓存配置--EHCache AND OSCache

Spring基于注解的缓存配置--web应用实例

2.5时,spring没有自己的解决方案,都是采用对许多第三方cache框架的支持,比如EHCache和OSCache等等,不过到了3.1,spring就只提供EHCache的支持了,不过spring3.1还给出了自己的解决方案。

 

下面简单介绍一下spring3.1.M1中的cache功能。

spring3.1.M1中负责cache的模块是org.springframework.context-3.1.0.M1.jar

 

与2.5时的modules模块类似,3.1的注解缓存也是在方法上声明注解,3.1同样提供了两个注解:

@Cacheable:负责将方法的返回值加入到缓存中

@CacheEvict:负责清除缓存

 

@Cacheable 支持如下几个参数:

value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name

key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL

condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

 

例如:

//将缓存保存进andCache,并使用参数中的userId加上一个字符串(这里使用方法名称)作为缓存的key 
@Cacheable(value="andCache",key="#userId + 'findById'")
public SystemUser findById(String userId) {
	SystemUser user = (SystemUser) dao.findById(SystemUser.class, userId);		
	return user ;		
}
//将缓存保存进andCache,并当参数userId的长度小于32时才保存进缓存,默认使用参数值及类型作为缓存的key
@Cacheable(value="andCache",condition="#userId.length < 32")
public boolean isReserved(String userId) {
	System.out.println("hello andCache"+userId);
	return false;
}

 

 

@CacheEvict 支持如下几个参数:

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

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

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

allEntries:true表示清除value中的全部缓存,默认为false

 

例如:

//清除掉指定key的缓存
@CacheEvict(value="andCache",key="#user.userId + 'findById'")
public void modifyUserRole(SystemUser user) {
         System.out.println("hello andCache delete"+user.getUserId());
}

//清除掉全部缓存
@CacheEvict(value="andCache",allEntries=true)
public void setReservedUsers() {
	System.out.println("hello andCache deleteall");
}

 

一般来说,我们的更新操作只需要刷新缓存中某一个值,所以定义缓存的key值的方式就很重要,最好是能够唯一,因为这样可以准确的清除掉特定的缓存,而不会影响到其它缓存值

比如我这里针对用户的操作,使用(userId+方法名称)的方式设定key值当然,你也可以找到更适合自己的方式去设定。

 

SpEL:Spring Expression Language

关于SpEL的介绍,可以参考如下地址:

http://static.springsource.org/spring/docs/3.1.0.M1/spring-framework-reference/html/expressions.html

 

 

了解了cache的注解之后,接下来说说如何使注解生效,其实就是需要在spring的配置文件中增加一些配置。

 

1.spring-cache

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

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

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	 xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
			http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">

 

之后添加如下声明:

       <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
	<cache:annotation-driven cache-manager="cacheManager"/>


	<!-- spring自己的换管理器,这里定义了两个缓存位置名称 ,既注解中的value -->
	<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
		<property name="caches">
			<set>
				<bean
					class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
					p:name="default" />
				<bean
					class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean"
					p:name="andCache" />
			</set>
		</property>
	</bean> 

 

2.spring-ehcache

接下来说说对ehcache的支持,其实只需要把cacheManager换成EHCache的cacheManager即可,如下:

        <!-- 启用缓存注解功能,这个是必须的,否则注解不会生效,另外,该注解一定要声明在spring主配置文件中才会生效 -->
	<cache:annotation-driven cache-manager="cacheManager"/>
	
	<!-- cacheManager工厂类,指定ehcache.xml的位置 --> 
	<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
		p:configLocation="classpath:/config/ehcache.xml" /> 

	<!-- 声明cacheManager -->
	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
		p:cacheManager-ref="cacheManagerFactory" />

 

 

 ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
	monitoring="autodetect">
	<!-- 
	<diskStore path="java.io.tmpdir" /> -->
	<diskStore path="E:/cachetmpdir"/>
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		maxElementsOnDisk="10000000" diskPersistent="false"
		diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
		
	<cache name="andCache" maxElementsInMemory="10000"
		maxElementsOnDisk="1000" eternal="false" overflowToDisk="true"
		diskSpoolBufferSizeMB="20" timeToIdleSeconds="300" timeToLiveSeconds="600"
		memoryStoreEvictionPolicy="LFU" />
</ehcache>  

 

 

ok,这样注解缓存就生效了。

 

 附件中是我自己写的一个小例子,工程结构如下所示,运行com.piaoyi.function.demo下的DemoTest即可

 

参考资料:

http://blog.springsource.com/2011/02/23/spring-3-1-m1-caching/

http://hi.baidu.com/coolcooldool/blog/item/3b541533c72b40e21a4cffda.html

 

 

Spring Cache注解+Memcached 

 

 

 

 

  • 大小: 32.8 KB
分享到:
评论
5 楼 leesenone 2014-06-27  
缓存同步怎么实现?
4 楼 zq125585625 2014-03-14  
很好的文章
3 楼 java.jianan 2012-08-08  
我按照这个方法配的,居然没有起作用,还是查询数据库了
2 楼 hanqunfeng 2011-11-17  
osacar 写道
请问一下楼主,这样是同时使用了spring cache和ehcache吗?
还是只能同时只用其一?
烦教~~~


只能使用一个,不过经过测试,spring对ehcache并没有很好的支持,不建议使用,可以参看http://hanqunfeng.iteye.com/blog/1204343
1 楼 osacar 2011-11-17  
请问一下楼主,这样是同时使用了spring cache和ehcache吗?
还是只能同时只用其一?
烦教~~~

相关推荐

    Spring 3.1 Cache Abstraction Tutorial

    《Spring 3.1 缓存抽象教程》 在现代Web应用开发中,缓存机制是提高性能和响应速度的关键技术之一。Spring框架从3.1版本开始引入了强大的缓存抽象,使得开发者能够轻松地在应用程序中集成缓存功能。本教程将深入...

    spring 3.1中的cache小结

    例如,使用`&lt;cache:advice&gt;`和`&lt;cache:annotation-driven&gt;`元素可以关联缓存注解与具体的缓存策略。 6. **缓存异常处理**:Spring提供了一套完整的异常处理机制,当缓存操作失败时,可以配置异常处理器来决定如何...

    spring3.1 api

    Spring 3.1对AOP进行了优化,支持@Profile注解,使得开发者可以根据不同的运行环境加载不同的配置。同时,新增了@Async注解,用于实现方法的异步执行,提高系统并发能力。 2. **依赖注入(Dependency Injection, ...

    struts2.3.4+spring3.1+hibernate4.0整合

    Spring3.1版本引入了Spring Expression Language (SpEL)、@Profile注解以及对Groovy的支持,增强了Spring的应用灵活性。 Hibernate是一个持久化框架,专注于对象关系映射(ORM),使得开发者可以使用Java对象来操作...

    JAVA编程之spring cache本机缓存应用

    1、SpringCache是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项 2、Spring Cache利用了AOP,实现了基于注解的缓存...

    java之SpringCache之@Cacheable注解的说明使用

    在Spring3.1以后增加了一项happy的技术点,就是基于注解来实现缓存的技术。他的本质上不是具体的缓存方案实现,而是一个对缓存的抽象,让我们通过注解,实现少量的代码,达到实现缓存的方案。 Cacheable的说明 @...

    Spring cache

    ##### 2.2 Spring Cache注解驱动方式 使用 Spring Cache 后,上述代码可以简化为: 1. **使用 @Cacheable**:标记在方法上,表示该方法的结果应该被缓存。 ```java @Cacheable(value = "accountCache", key = ...

    Spring Boot 整合 Spring-cache:让你的网站速度飞起来.docx

    Spring Cache 是 Spring 框架的一个模块,自 3.1 版本起引入,提供了基于注解的缓存抽象,使得开发者能够方便地在应用中集成和管理缓存。 一、Spring Cache 介绍 Spring Cache 提供了一种统一的方式来管理不同类型...

    spring3.2.2+mybatis3.1-lib

    7. **性能优化**: 整合后,可以通过Spring的缓存支持来优化性能,例如使用Spring的Cache抽象进行二级缓存的实现。此外,还可以利用Spring的事务管理策略,如只读事务、事务超时等特性来提升系统性能。 8. **测试...

    点智数码--注释驱动的-Spring-cache-缓存的介绍.doc

    Spring Cache 是 Spring 框架从 3.1 版本开始引入的一种注解驱动的缓存抽象,它提供了一种简单而灵活的方式来在应用程序中实现缓存功能,无需依赖特定的缓存实现,如 EhCache 或 OSCache。Spring Cache 的核心特性...

    Spring Cache的基本使用与实现原理详解

    Spring Cache 是Spring框架提供的一种缓存抽象,从Spring 3.1版本开始引入,目的是为了简化应用程序中的缓存管理,实现缓存透明化。通过在方法上添加特定注解,如@Cacheable、@CacheEvict等,可以轻松地启用缓存功能...

    Spring基于注解的缓存配置--EHCache AND OSCache

    Spring 3.1引入了一种统一的缓存抽象,它允许开发者在不关心具体缓存实现的情况下,轻松地在应用程序中引入缓存功能。这种抽象包括了注解、接口和配置元素,使得缓存的使用变得简单。 2. **注解驱动的缓存** - `@...

    spring-framework-reference.pdf

    - **Cache Abstraction**:Spring 3.1引入了缓存抽象,使得开发人员可以轻松地使用不同的缓存解决方案。 - **Bean Definition Profiles**:Spring 3.1支持定义Bean的配置文件,可以根据不同的环境选择不同的配置。 -...

    浅析SpringCache缓存1

    Spring Cache 是 Spring 框架从 3.1 版本开始引入的一个强大特性,它提供了一种透明化的缓存机制,允许开发者在不修改原有业务代码的基础上,轻松地为应用程序添加缓存功能。这个抽象层使得我们可以使用不同的缓存...

    Spring来实现一个Cache简单的解决方案

    Spring框架提供了多种方式来管理和操作缓存,包括基于注解的缓存管理、基于XML配置的缓存管理等。本文将重点介绍如何通过Spring AOP和ehCache来实现缓存功能。 ##### 2.1 Spring AOP Spring AOP(Aspect Oriented ...

    spring3.1.4源码

    12. **缓存抽象**:Spring 3.1引入了缓存抽象,支持Ehcache、Hazelcast等缓存系统,相关接口位于`org.springframework.cache`包下。 通过阅读和分析Spring 3.1.4的源码,开发者可以深入了解Spring框架的设计理念和...

    spring memcached

    ### Spring 3.1 对 Memcached 的集成与应用 #### 一、Spring 集成缓存概述 从 Spring 3.1 开始,Spring 框架正式引入了对缓存的支持,使得开发者能够更加方便地管理和使用缓存技术。这一特性极大地简化了缓存的...

    spring3.2的官方文档

    6. Spring 3.1新增特性:文档中还提到Spring Framework 3.1中引入的新特性,例如缓存抽象(Cache Abstraction)、Bean定义配置文件(BeanDefinitionProfiles)、环境抽象(Environment Abstraction)、属性源抽象...

    spring官方文档pdf

    - Spring 3.1版本中新增了缓存抽象、Bean定义概要、环境抽象和PropertySource抽象。 - 支持Hibernate 4.x版本,增强了与Hibernate的集成能力。 - 测试框架改进,增强了对@configuration类和bean定义概要文件的...

Global site tag (gtag.js) - Google Analytics