Spring4.1新特性——Spring缓存框架增强(转)
目录
Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介
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之前需要每个方法上都指定:
- @Service
- public 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时的异常的回调处理器。
相关资料
Spring4新特性
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——注解、脚本、任务、MVC等其他特性改进
源码下载
https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-cache
Spring4.1新特性——Spring缓存框架增强(转)的更多相关文章
- Spring4.1新特性——Spring MVC增强
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- Spring框架入门之Spring4.0新特性——泛型注入
Spring框架入门之Spring4.0新特性——泛型注入 一.为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入. ...
- Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27
Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承 ...
- (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...
- Exadata 18.1新特性--计算节点升级增强
新的计算节点升级增强能大幅缩短升级花费的时间,最快能减少40%的时间,具体的增强主要体现在以下方面: 1.计算节点操作系统的备份工作. 以前计算节点操作系统的备份工作是在正式升级之前执行,在滚动升级过 ...
- 11g新特性-查询缓存(1)
众所周知,访问内存比访问硬盘快得多,除非硬盘体系发生革命性的改变.可以说缓存在Oracle里面无处不在,结果集缓存(Result Cache)是Oracle Database 11g新引入的功能,引入 ...
- Java 8新特性-2 接口定义增强
为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的 ...
- 理解Spring4.0新特性@RestController注解
参考原文 @RestController注解是它继承自@Controller注解.4.0之前的版本,spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet. 使用 ...
- SQL Server ->> SQL Server 2016新特性之 -- AlwaysOn的增强改进
1)标准版也开始支持AlwaysOn了,只不过限制太多,比如副节点不能只读访问和只能有一个副节点. 2)副节点(只读节点)的负载均衡,这是我认为最有用的改进 3)自动failover的节点从2个增加到 ...
随机推荐
- 【前端】Three.js
Three.js 基本概念 渲染器(Renderer) 渲染器将和Canvas元素进行绑定 场景(Scene) 在Three.js中添加的物体都是添加到场景中的,因此它相当于一个大容器.一般说,场景里 ...
- [模板] SAP
int dfs(int x,int flow){ if(x==T) return flow; int tmp=res=0; for(int i=last[x];i;i=next[i]) if (d[x ...
- 1. ReactNative 基础
/** 1. reactNative 反应式语言 2. 既拥有原生的用户体验,又保留React的开发效率 3. FaceBook研究 H5,Android,iOS 4. BAT的插件化,热修改 2 ...
- solrconfig.xml解析
solrconfig.xml配置文件主要定义了SOLR的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置.下面将对solrconfig进行详细描述:1 <luceneMatc ...
- 省市级联.net
初学javascript,编译省市级联,使用json在一般处理程序中编译,利用ajax传递数据到web前台 <html xmlns="http://www.w3.org/1999/xh ...
- Sublime Text3 快捷键
选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑.举个栗子:快速选中并更改所有相同的变量名.函数 ...
- iOS - AliPay 支付宝支付
1.支付宝支付申请 支付宝支付官方签约集成指引 支付宝APP支付官方集成指引 蚂蚁金服开放平台 1.1 支付宝 APP 支付申请步骤 APP 支付:APP 支付是商户通过在移动端应用 APP 中集成开 ...
- Control.DataBinding数据绑定简单用法:
DataBindings的用法: 第一个值:要绑定到TextBox的什么地方 第二个值:数据源是什么 第三个值:应该取数据源的什么属性 第四个值:是否开启数据格式化 第五个值:在什么时候启用数据源绑定 ...
- 安卓自定义View(一)自定义控件属性
自定义View增加属性第一步:定义属性资源文件 在/res/values 文件夹下建立"Values XML layout",按照如下定义一个textview的属性 <?xm ...
- HTML5 十大新特性(五)——SVG绘图
相对于canvas绘图,SVG是一种绘制矢量图的技术.全称叫做Scalable Vector Graphics,可缩放的矢量图,在2000年就已经存在,H5把它纳入了标准标签库,并进行了一些瘦身.需要 ...