`
zzc1684
  • 浏览: 1190435 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Spring4.1新特性——Spring缓存框架增强

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

Spring 4.1提供了对jcache的支持,并对cache抽象部分进行了一些简单的增强。在集成jcache时是非常费劲的,版本之间各种不兼容,不建议用于正式环境,在正式环境中可以使用如Guava Cache或Ehcache。

 

jcache依赖:

Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>net.sf.ehcache</groupId>  
  3.     <artifactId>ehcache-jcache</artifactId>  
  4.     <version>${ehcache-jcache.version}</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>javax.cache</groupId>  
  8.     <artifactId>cache-api</artifactId>  
  9.     <version>${javax.cache.version}</version>  
  10. </dependency>  
  11. <dependency>  
  12.     <groupId>org.jsr107.ri</groupId>  
  13.     <artifactId>cache-ri-impl</artifactId>  
  14.     <version>${cache-ri-impl.version}</version>  
  15. </dependency>    

<javax.cache.version>1.0.0</javax.cache.version>、<cache- ri-impl.version>1.0.0</cache-ri-impl.version>、<ehcache- jcache.version>1.2</ehcache-jcache.version>,具体请参考源码。

 

1、Jcache集成

创建Cache: 

Java代码  收藏代码
  1. javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();  
  2. MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();  
  3. mutableConfiguration.setStoreByValue(false);  // otherwise value has to be Serializable  
  4. cacheManager.createCache("user", mutableConfiguration);  
  5. cacheManager.createCache("user2", mutableConfiguration);  
  6. cacheManager.createCache("user3", mutableConfiguration);  
  7.   
  8. JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);  
  9. return jCacheCacheManager;  

 

Java Config方式提供了CachingConfigurer用于提供配置回调:   

Java代码  收藏代码
  1. @Configuration  
  2. @ComponentScan(basePackages = "com.sishuok.spring.service")  
  3. @EnableCaching(proxyTargetClass = true)  
  4. public class AppConfig implements CachingConfigurer {  
  5.     @Bean  
  6.     @Override  
  7.     public CacheManager cacheManager() {  
  8.         javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();  
  9.         MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();  
  10.         mutableConfiguration.setStoreByValue(false);  // otherwise value has to be Serializable  
  11.         cacheManager.createCache("user", mutableConfiguration);  
  12.         cacheManager.createCache("user2", mutableConfiguration);  
  13.         cacheManager.createCache("user3", mutableConfiguration);  
  14.   
  15.         JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);  
  16.         return jCacheCacheManager;  
  17.     }  
  18.   
  19.     @Bean  
  20.     @Override  
  21.     public CacheResolver cacheResolver() {  
  22.         return new MyCacheResolver();  
  23.     }  
  24.   
  25.     @Bean  
  26.     @Override  
  27.     public KeyGenerator keyGenerator() {  
  28.         return new SimpleKeyGenerator();  
  29.     }  
  30.   
  31.     @Override  
  32.     public CacheErrorHandler errorHandler() {  
  33.         return new CacheErrorHandler() {  
  34.             @Override  
  35.             public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {  
  36.                 System.out.println("cache get error");  
  37.             }  
  38.   
  39.             @Override  
  40.             public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {  
  41.                 System.out.println("cache put error");  
  42.             }  
  43.   
  44.             @Override  
  45.             public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {  
  46.                 System.out.println("cache evict error");  
  47.             }  
  48.   
  49.             @Override  
  50.             public void handleCacheClearError(RuntimeException exception, Cache cache) {  
  51.                 System.out.println("cache clear error");  
  52.             }  
  53.         };  
  54.     }  
  55. }  

 

 

2、@CacheConfig指定全局Cache配置

Spring 4.1之前需要每个方法上都指定: 

Java代码  收藏代码
  1. @Service  
  2. public class UserService {  
  3.   
  4.     Set<User> users = new HashSet<User>();  
  5.   
  6.     @CachePut(value = "user", key = "#user.id")  
  7.     public User save(User user) {  
  8.         users.add(user);  
  9.         return user;  
  10.     }  
  11.   
  12.     @CachePut(value = "user", key = "#user.id")  
  13.     public User update(User user) {  
  14.         users.remove(user);  
  15.         users.add(user);  
  16.         return user;  
  17.     }  
  18.   
  19.     @CacheEvict(value = "user", key = "#user.id")  
  20.     public User delete(User user) {  
  21.         users.remove(user);  
  22.         return user;  
  23.     }  
  24.   
  25.     @CacheEvict(value = "user", allEntries = true)  
  26.     public void deleteAll() {  
  27.         users.clear();  
  28.     }  
  29.   
  30.     @Cacheable(value = "user", key = "#id")  
  31.     public User findById(final Long id) {  
  32.         System.out.println("cache miss, invoke find by id, id:" + id);  
  33.         for (User user : users) {  
  34.             if (user.getId().equals(id)) {  
  35.                 return user;  
  36.             }  
  37.         }  
  38.         return null;  
  39.     }  
  40.   
  41. }  

 

 

Spring 4.1时可以直接在类级别使用@CacheConfig指定: 

Java代码  收藏代码
  1. @Service  
  2. @CacheConfig(cacheNames = {"user""user2"})  
  3. public class UserService {  
  4.   
  5.     Set<User> users = new HashSet<User>();  
  6.   
  7.     @CachePut(key = "#user.id")  
  8.     public User save(User user) {  
  9.         users.add(user);  
  10.         return user;  
  11.     }  
  12.   
  13.     @CachePut(key = "#user.id")  
  14.     public User update(User user) {  
  15.         users.remove(user);  
  16.         users.add(user);  
  17.         return user;  
  18.     }  
  19.   
  20.     @CacheEvict(key = "#user.id")  
  21.     public User delete(User user) {  
  22.         users.remove(user);  
  23.         return user;  
  24.     }  
  25.   
  26.     @CacheEvict(allEntries = true)  
  27.     public void deleteAll() {  
  28.         users.clear();  
  29.     }  
  30.   
  31.     @Cacheable(key = "#id")  
  32.     public User findById(final Long id) {  
  33.         System.out.println("cache miss, invoke find by id, id:" + id);  
  34.         for (User user : users) {  
  35.             if (user.getId().equals(id)) {  
  36.                 return user;  
  37.             }  
  38.         }  
  39.         return null;  
  40.     }  
  41. }  

 

3、CacheResolver

其名字已经暗示了其是Cache解析器,用于根据实际情况来动态解析使用哪个Cache,如: 

Java代码  收藏代码
  1. public class MyCacheResolver implements CacheResolver {  
  2.   
  3.     @Autowired  
  4.     private CacheManager cacheManager;  
  5.   
  6.     @Override  
  7.     public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {  
  8.         List<Cache> caches = new ArrayList<Cache>();  
  9.         for(String cacheName : context.getOperation().getCacheNames()) {  
  10.             caches.add(cacheManager.getCache(cacheName));  
  11.         }  
  12.         if(context.getTarget() instanceof UserService2) {  
  13.             caches.add(cacheManager.getCache("user2"));  
  14.             caches.add(cacheManager.getCache("user3"));  
  15.         }  
  16.         return caches;  
  17.     }  
  18. }  

context中存放了当前cache的操作类型、目标对象、目标方法、参数信息,这样我们可以根据这些信息来决定使用那些 cache; context.getOperation().getCacheNames()得到当前目标对象/目标方法上配置的cache Name;然后我们可以在此基础上添加额外的cache。

 

 

此处需要注意的是即使配置了CacheResolver,也必须在@CacheConfig或方法上的如@CachePut上指定至少一个Cache Name。

 

4、CacheErrorHandler

用于捕获从Cache中进行CRUD时的异常的回调处理器。

 

相关资料

Spring Cache抽象详解 

 

Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

 

源码下载

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-cache

 

评论
7 楼 xizhico 2014-08-27   引用
spring2的controller中设置cacheSeconds=0,页面不缓存,我想问问博主,spring4中怎么设置?
6 楼 iq527 2014-08-19   引用
Spring4.1新特性——Spring核心部分及其他

链接链错了哦 
5 楼 jinnianshilongnian 2014-08-18   引用
LinApex 写道
请问 开涛,有了解过组件化这一块吗?

看 到了一个网上打着开源项目却不开源的系统 javashop,我发现其中有一个很好的特性  组件式架构,下载了它4.0的源码看了一下,其中lib包有三个组件. eop,shop,cms ,编译其源码看了一下,看到 js,css,html 都包含其内,感觉这种方式存在问题,看了一下其整体架构,扩展,非常不方便。如果有了解过的话,请告知一下,谢谢!

可以看看servlet3
4 楼 LinApex 2014-08-18   引用
请问 开涛,有了解过组件化这一块吗?

看到了一个网上打着开源项目却不 开源的系统 javashop,我发现其中有一个很好的特性  组件式架构,下载了它4.0的源码看了一下,其中lib包有三个组件. eop,shop,cms ,编译其源码看了一下,看到 js,css,html 都包含其内,感觉这种方式存在问题,看了一下其整体架构,扩展,非常不方便。如果有了解过的话,请告知一下,谢谢!
3 楼 yq81862 2014-08-18   引用
一直不明白,cache为什么要和spring集成,有什么好处??
但是使用cache不就好了???
2 楼 jinnianshilongnian 2014-08-18   引用
chenzenghua 写道
请问开涛,Spring用这种方式,可以与memcache集成吗?

完全可以啊,需要你写自己的CacheManager
1 楼 chenzenghua 2014-08-18   引用
请问开涛,Spring用这种方式,可以与memcache集成吗?
分享到:
评论

相关推荐

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    Java Web程序设计教程

    11.6项目实战——spring问候程序 239 本章小结 241 课后练习 241 第12章springaop 242 12.1aop基础 242 12.1.1aop与oop的比较 242 12.1.2aop的核心概念 243 12.1.3java动态代理与aop 244 12.1.4springaop...

    camel-cxf-jms-demo:示例 Apache Camel 应用程序(CXF、REST、JMS、缓存)

    Apache Camel——主要应用框架,负责所有组件的集成; Spring DSL用于路由配置; Apache CXF作为 WS 实现; ActiveMQ - JMS 代理; Ehcache - Camel 缓存实现; Maven 的生命周期支持; 单元测试( jUnit启动...

    webx3框架指南PDF教程附学习Demo

    • 对Spring的直接支持 —— Spring是当今主流的轻量级框架。Webx 3.0和Spring MVC一样, 完全建立在Spring框架之上,故可运用Spring的所有特性。 • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是...

    低清版 大型门户网站是这样炼成的.pdf

    6.1.3 spring 2.5拿手戏——控制反转与依赖注入 353 6.1.4 何为“面向切面编程aop” 356 6.1.5 spring 2.5圣经——面向接口编程 358 6.1.6 开始spring 2.5旅程—hello world 359 6.2 spring 2.5核心技术 364 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

     SQL Server 2000与以前版本相比较,又具有以下新特性 :  1.支持XML(Extensive Markup Language,扩展标记语言)  2.强大的基于Web的分析  3.支持OLE DB和多种查询  4.支持分布式的分区视图  安装、...

Global site tag (gtag.js) - Google Analytics