Spring4.1新特性——Spring缓存框架增强

编程技术  /  houtizong 发布于 3年前   134

目录

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

        <dependency>            <groupId>net.sf.ehcache</groupId>            <artifactId>ehcache-jcache</artifactId>            <version>${ehcache-jcache.version}</version>        </dependency>        <dependency>            <groupId>javax.cache</groupId>            <artifactId>cache-api</artifactId>            <version>${javax.cache.version}</version>        </dependency>        <dependency>            <groupId>org.jsr107.ri</groupId>            <artifactId>cache-ri-impl</artifactId>            <version>${cache-ri-impl.version}</version>        </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: 

        javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();        MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();        mutableConfiguration.setStoreByValue(false);  // otherwise value has to be Serializable        cacheManager.createCache("user", mutableConfiguration);        cacheManager.createCache("user2", mutableConfiguration);        cacheManager.createCache("user3", mutableConfiguration);        JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);        return jCacheCacheManager;

 

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

@Configuration@ComponentScan(basePackages = "com.sishuok.spring.service")@EnableCaching(proxyTargetClass = true)public class AppConfig implements CachingConfigurer {    @Bean    @Override    public CacheManager cacheManager() {        javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();        MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();        mutableConfiguration.setStoreByValue(false);  // otherwise value has to be Serializable        cacheManager.createCache("user", mutableConfiguration);        cacheManager.createCache("user2", mutableConfiguration);        cacheManager.createCache("user3", mutableConfiguration);        JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);        return jCacheCacheManager;    }    @Bean    @Override    public CacheResolver cacheResolver() {        return new MyCacheResolver();    }    @Bean    @Override    public KeyGenerator keyGenerator() {        return new SimpleKeyGenerator();    }    @Override    public CacheErrorHandler errorHandler() {        return new CacheErrorHandler() {            @Override            public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {                System.out.println("cache get error");            }            @Override            public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {                System.out.println("cache put error");            }            @Override            public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {                System.out.println("cache evict error");            }            @Override            public void handleCacheClearError(RuntimeException exception, Cache cache) {                System.out.println("cache clear error");            }        };    }}

 

 

2、@CacheConfig指定全局Cache配置

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

@Servicepublic class UserService {    Set<User> users = new HashSet<User>();    @CachePut(value = "user", key = "#user.id")    public User save(User user) {        users.add(user);        return user;    }    @CachePut(value = "user", key = "#user.id")    public User update(User user) {        users.remove(user);        users.add(user);        return user;    }    @CacheEvict(value = "user", key = "#user.id")    public User delete(User user) {        users.remove(user);        return user;    }    @CacheEvict(value = "user", allEntries = true)    public void deleteAll() {        users.clear();    }    @Cacheable(value = "user", key = "#id")    public User findById(final Long id) {        System.out.println("cache miss, invoke find by id, id:" + id);        for (User user : users) {            if (user.getId().equals(id)) {                return user;            }        }        return null;    }}

 

 

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

@Service@CacheConfig(cacheNames = {"user", "user2"})public class UserService {    Set<User> users = new HashSet<User>();    @CachePut(key = "#user.id")    public User save(User user) {        users.add(user);        return user;    }    @CachePut(key = "#user.id")    public User update(User user) {        users.remove(user);        users.add(user);        return user;    }    @CacheEvict(key = "#user.id")    public User delete(User user) {        users.remove(user);        return user;    }    @CacheEvict(allEntries = true)    public void deleteAll() {        users.clear();    }    @Cacheable(key = "#id")    public User findById(final Long id) {        System.out.println("cache miss, invoke find by id, id:" + id);        for (User user : users) {            if (user.getId().equals(id)) {                return user;            }        }        return null;    }}

 

3、CacheResolver

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

public class MyCacheResolver implements CacheResolver {    @Autowired    private CacheManager cacheManager;    @Override    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {        List<Cache> caches = new ArrayList<Cache>();        for(String cacheName : context.getOperation().getCacheNames()) {            caches.add(cacheManager.getCache(cacheName));        }        if(context.getTarget() instanceof UserService2) {            caches.add(cacheManager.getCache("user2"));            caches.add(cacheManager.getCache("user3"));        }        return caches;    }}

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

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客