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

  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

上一篇:浏览器同源策略,跨域请求jsonp


下一篇:Memory Cache(内存缓存)