目录

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. MySQL 安装 + 精简 + 配置

    MySQL 安装 + 精简 + 配置 下载安装 从官网 下载 Community Edition MySQL 5.6 版本 精简 根目录下只留 [data/bin/share] , my-defaul ...

  2. (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)

    在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...

  3. 【leetcode❤python】 204. Count Primes

    #-*- coding: UTF-8 -*- #Hint1:#数字i,i的倍数一定不是质数,因此去掉i的倍数,例如5,5*1,5*2,5*3,5*4,5*5都不是质数,应该去掉#5*1,5*2,5*3 ...

  4. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  5. jQuery事件绑定.on()简要概述及应用

    原文地址:http://www.jquerycn.cn/a_5346     前几天看到事件委托的时候,关于live()方法讲的不是很详细,就去搜了一下关于live()和delegate()的,最后看 ...

  6. 1006. Sign In and Sign Out (25)

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  7. point

    7.10 []getch->_getch []错误:fatal error C1189: #error : EasyX is only for C++ :.c改为.cpp

  8. mybatis入门_配置文件的配置

    一.全局配置文件配置 1.1 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties中..) 下为db. ...

  9. iOS 工程功能实现之好用的第三方

    1.http://www.cocoachina.com/ios/20140224/7868.html  (一个天气App案例) LBBlurredImage是一个继承自UIImageView,轻而易举 ...

  10. 关于HTML5你必须知道的28个新特性,新技巧以及新技术

    1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...