目录

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. HQL查询——关联和连接

    HQL查询--关联和连接 为了便于理解有关的使用关联和连接进行HQL查询,首先提供两个具有关联关系的持久化类:Person类和MyEvent类 Person类: import javax.persis ...

  2. Android runtime Exception 整理

    一般面试中java Exception(runtimeException )是必会被问到的问题 常见的异常列出四五种,是基本要求.更多的....需要注意积累了   常见的几种如下:   NullPoi ...

  3. shutdown的简单小应用

    关于shutdown的操作命令在此不做详细叙述 1.WIN+R ,输入cmd即打开cmd命令界面 2.输入shutdown /help,出现下图 这里介绍一个关于shutdown的小应用: 比如我们的 ...

  4. web前端之HTML的大框架(body元素与frameset元素)

    web前端之HTML的大框架      body元素与frameset元素 对于从事html的人员来说,我们一般熟悉的框架是先声明html ,然后在<html>标签对里包着<head ...

  5. 谈谈Memcached与Redis

    1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...

  6. 流媒体测试笔记记录之————阿里云监控、OBS、FFmpeg拉流和推流变化比较记录

    OBS设置视频(512kbps)和音频(128kbps)比特率 阿里云监控结果: 使用FFmpeg拉流到Nginx 服务器测试比特率 第二次测试,修改视频和音频比特率 OBS设置 阿里云监控 Ngin ...

  7. Comparator

    1.java.util.Comparator 一个实现了comparator接口的对象能够对比不同的对象.它不能用于同一个类的不同实例的对比,但是可以用于其他的类的实例做对比.必须实现java.uti ...

  8. angularJS中的ui-router和ng-grid模块

    关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里https://github. ...

  9. js中call、apply、bind的用法

    原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...

  10. 使用Asp.Net Core Identity给用户添加及删除角色

    基于Asp.Net Core编制一个项目,需要给用户添加及删除角色的功能,于是使用到了Identity中的UserManager. 先后解决了几个问题,终于实现了设想. 1. 环境条件 Asp.Net ...