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

    Java代码  收藏代码
    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: 

    Java代码  收藏代码
    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.   
    8. JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);  
    9. return jCacheCacheManager;  

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

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

    2、@CacheConfig指定全局Cache配置

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

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

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

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

    3、CacheResolver

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

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

    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

  • 相关阅读:
    IOS开发mapkit学习笔记
    IOS的两种框架设计思想
    关于创建及使用多线程的几种方法
    Linux基础入门 之挑战:历史命令
    20172018网络攻防第三周
    20172018网络攻防第二周
    Linux基础入门实验楼挑战之数据提取
    iconfont字体图标的使用方法超简单!
    CSS中的绝对定位(absolute)误区
    获取对象属性的点方法和中括号法的区别
  • 原文地址:https://www.cnblogs.com/goooto/p/5976584.html
Copyright © 2020-2023  润新知