目录

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依赖:

  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:

  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. JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
  8. return jCacheCacheManager;

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

  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. JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
  15. return jCacheCacheManager;
  16. }
  17. @Bean
  18. @Override
  19. public CacheResolver cacheResolver() {
  20. return new MyCacheResolver();
  21. }
  22. @Bean
  23. @Override
  24. public KeyGenerator keyGenerator() {
  25. return new SimpleKeyGenerator();
  26. }
  27. @Override
  28. public CacheErrorHandler errorHandler() {
  29. return new CacheErrorHandler() {
  30. @Override
  31. public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
  32. System.out.println("cache get error");
  33. }
  34. @Override
  35. public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
  36. System.out.println("cache put error");
  37. }
  38. @Override
  39. public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
  40. System.out.println("cache evict error");
  41. }
  42. @Override
  43. public void handleCacheClearError(RuntimeException exception, Cache cache) {
  44. System.out.println("cache clear error");
  45. }
  46. };
  47. }
  48. }

2、@CacheConfig指定全局Cache配置

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

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

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

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

3、CacheResolver

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

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

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

Spring4.1新特性——Spring缓存框架增强(转)的更多相关文章

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

    目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...

  2. Spring框架入门之Spring4.0新特性——泛型注入

    Spring框架入门之Spring4.0新特性——泛型注入 一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. ...

  3. Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27

    Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承  ...

  4. (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型

    Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...

  5. Exadata 18.1新特性--计算节点升级增强

    新的计算节点升级增强能大幅缩短升级花费的时间,最快能减少40%的时间,具体的增强主要体现在以下方面: 1.计算节点操作系统的备份工作. 以前计算节点操作系统的备份工作是在正式升级之前执行,在滚动升级过 ...

  6. 11g新特性-查询缓存(1)

    众所周知,访问内存比访问硬盘快得多,除非硬盘体系发生革命性的改变.可以说缓存在Oracle里面无处不在,结果集缓存(Result Cache)是Oracle Database 11g新引入的功能,引入 ...

  7. Java 8新特性-2 接口定义增强

    为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的  ...

  8. 理解Spring4.0新特性@RestController注解

    参考原文 @RestController注解是它继承自@Controller注解.4.0之前的版本,spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet. 使用 ...

  9. SQL Server ->> SQL Server 2016新特性之 -- AlwaysOn的增强改进

    1)标准版也开始支持AlwaysOn了,只不过限制太多,比如副节点不能只读访问和只能有一个副节点. 2)副节点(只读节点)的负载均衡,这是我认为最有用的改进 3)自动failover的节点从2个增加到 ...

随机推荐

  1. 【前端】Three.js

    Three.js 基本概念 渲染器(Renderer) 渲染器将和Canvas元素进行绑定 场景(Scene) 在Three.js中添加的物体都是添加到场景中的,因此它相当于一个大容器.一般说,场景里 ...

  2. [模板] SAP

    int dfs(int x,int flow){ if(x==T) return flow; int tmp=res=0; for(int i=last[x];i;i=next[i]) if (d[x ...

  3. 1. ReactNative 基础

    /** 1. reactNative  反应式语言 2. 既拥有原生的用户体验,又保留React的开发效率 3. FaceBook研究 H5,Android,iOS 4. BAT的插件化,热修改  2 ...

  4. solrconfig.xml解析

    solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置.下面将对solrconfig进行详细描述:1 <luceneMatc ...

  5. 省市级联.net

    初学javascript,编译省市级联,使用json在一般处理程序中编译,利用ajax传递数据到web前台 <html xmlns="http://www.w3.org/1999/xh ...

  6. Sublime Text3 快捷键

    选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数 ...

  7. iOS - AliPay 支付宝支付

    1.支付宝支付申请 支付宝支付官方签约集成指引 支付宝APP支付官方集成指引 蚂蚁金服开放平台 1.1 支付宝 APP 支付申请步骤 APP 支付:APP 支付是商户通过在移动端应用 APP 中集成开 ...

  8. Control.DataBinding数据绑定简单用法:

    DataBindings的用法: 第一个值:要绑定到TextBox的什么地方 第二个值:数据源是什么 第三个值:应该取数据源的什么属性 第四个值:是否开启数据格式化 第五个值:在什么时候启用数据源绑定 ...

  9. 安卓自定义View(一)自定义控件属性

    自定义View增加属性第一步:定义属性资源文件 在/res/values 文件夹下建立"Values XML layout",按照如下定义一个textview的属性 <?xm ...

  10. HTML5 十大新特性(五)——SVG绘图

    相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要 ...