目录

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. Java中的四舍五入

    经典案例分析:public class RoundTest {    public static void main(String[] args) {        System.err.printl ...

  2. 图解MySQL5.5详细安装与配置过程

    MySQL是一个开源的关系型数据库管理系统,原由瑞典MySQL AB公司开发,目前属于Oracle公司旗下.MySQL是目前世界上开源数据库中最受欢迎的产品之一,是应用最为广泛的开源数据库.MySQL ...

  3. SQLServer语句执行效率及性能测试

    写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...

  4. Node聊天程序实例05:index.html和style.css

    作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. index. ...

  5. boost字符串算法

    boost::algorithm简介 2007-12-08 16:59 boost::algorithm提供了很多字符串算法,包括: 大小写转换: 去除无效字符: 谓词: 查找: 删除/替换: 切割: ...

  6. Windows 更改桌面位置

    运行regedit HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders 找到 ...

  7. CDN加速原理

    原文链接:http://www.72e.net/cdnspeed/cdnyuanli.aspx 首先,让我们来看一下传统的Internet网络的基本结构和数据传输情况,如下图所示. Internet  ...

  8. [经验] Win7减肥攻略(删文件不删功能、简化优化系统不简优化性能)

    [经验] Win7减肥攻略(删文件不删功能.简化优化系统不简优化性能) ☆心梦无痕☆ 发表于 2014-1-24 11:15:04 https://www.itsk.com/thread-316471 ...

  9. error CS0117: `UnityEditor.EditorUtility' does not contain a definition for `GetAssetPreview'

    have to replace: EditorUtility by AssetPreview

  10. Apache Commons Lang

    http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/package- ...