`
jinnianshilongnian
  • 浏览: 21505531 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418841
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3009005
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639615
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259983
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597423
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250258
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5859117
Group-logo
跟我学Nginx+Lua开...
浏览量:702360
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785290
社区版块
存档分类
最新评论

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

        <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时的异常的回调处理器。

 

相关资料

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

 

8
1
分享到:
评论
8 楼 xuhaibin500 2014-11-07  
   最近在弄cache, 选得是 memcache, 但是没办法用spring 的 cache 注解了,不方便.

  请问开涛, 可不可以写篇关于 spring 集成 memcache 的文章啊? 
7 楼 xizhico 2014-08-27  
spring2的controller中设置cacheSeconds=0,页面不缓存,我想问问博主,spring4中怎么设置?
6 楼 iq527 2014-08-19  
Spring4.1新特性——Spring核心部分及其他

链接链错了哦 
5 楼 jinnianshilongnian 2014-08-18  
LinApex 写道
请问 开涛,有了解过组件化这一块吗?

看到了一个网上打着开源项目却不开源的系统 javashop,我发现其中有一个很好的特性  组件式架构,下载了它4.0的源码看了一下,其中lib包有三个组件. eop,shop,cms ,编译其源码看了一下,看到 js,css,html 都包含其内,感觉这种方式存在问题,看了一下其整体架构,扩展,非常不方便。如果有了解过的话,请告知一下,谢谢!

可以看看servlet3
4 楼 LinApex 2014-08-18  
请问 开涛,有了解过组件化这一块吗?

看到了一个网上打着开源项目却不开源的系统 javashop,我发现其中有一个很好的特性  组件式架构,下载了它4.0的源码看了一下,其中lib包有三个组件. eop,shop,cms ,编译其源码看了一下,看到 js,css,html 都包含其内,感觉这种方式存在问题,看了一下其整体架构,扩展,非常不方便。如果有了解过的话,请告知一下,谢谢!
3 楼 yq81862 2014-08-18  
一直不明白,cache为什么要和spring集成,有什么好处??
但是使用cache不就好了???
2 楼 jinnianshilongnian 2014-08-18  
chenzenghua 写道
请问开涛,Spring用这种方式,可以与memcache集成吗?

完全可以啊,需要你写自己的CacheManager
1 楼 chenzenghua 2014-08-18  
请问开涛,Spring用这种方式,可以与memcache集成吗?

相关推荐

    Spring4.X最新帮助文档带视图结构树的

    Spring 4.1的新特性和增强功能** - **介绍:** 本章节介绍了Spring 4.1版本中新增或改进的功能。 - **知识点:** - **JMS改进(JMS Improvements):** 增强了JMS支持,例如更灵活的消息发送机制。 - **缓存改进...

    spring+MQ消息队列

    `@JmsListener`是Spring 4.1引入的,可以直接在方法上声明监听哪个队列或主题,简化了代码。 5. **消息模型**:ActiveMQ支持两种基本的消息模型——点对点(Queue)和发布/订阅(Topic)。点对点模式下,每个消息...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    Struts2.5+Hibernate3.3+Spring应用开发实例

    在掌握了Struts2、Hibernate和Spring的独立使用后,学员将面临更大的挑战——整合这三个框架,开发一个功能完善的网上购物系统。这不仅要求对每个框架有深入的理解,还需要熟悉它们之间的交互方式,以及如何优化整个...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    在当今Java EE 开发中,Spring 框架是当之无愧的王者。而Spring Boot 是Spring 主推的基于“习惯优于配置”的原则,让你能够快速搭建应用的框架,从而使得Java EE 开发变得异常简单。 《JavaEE开发的颠覆者: Spring ...

    Spring Boot中的@Scheduled注解:定时任务的原理与实现

    Spring Boot作为一个流行的微服务开发框架,为开发者提供了一种简单而强大的方式来处理定时任务——即通过使用`@Scheduled`注解。本文将详细介绍`@Scheduled`注解的工作原理、配置方法以及如何在实际项目中运用它来...

    Java Web程序设计教程

    11.6项目实战——spring问候程序 239 本章小结 241 课后练习 241 第12章springaop 242 12.1aop基础 242 12.1.1aop与oop的比较 242 12.1.2aop的核心概念 243 12.1.3java动态代理与aop 244 12.1.4springaop...

    camel-cxf-jms-demo:示例 Apache Camel 应用程序(CXF、REST、JMS、缓存)

    Apache Camel——主要应用框架,负责所有组件的集成; Spring DSL用于路由配置; Apache CXF作为 WS 实现; ActiveMQ - JMS 代理; Ehcache - Camel 缓存实现; Maven 的生命周期支持; 单元测试( jUnit启动...

    翔明.doc

    ### 知识点一:Spring框架的简单使用 #### 1.1 Spring框架简介 Spring框架是一个开源的轻量级Java开发框架,旨在简化企业级应用的开发过程。它提供了全面的基础架构支持,使得开发者可以专注于业务逻辑的实现,而...

    Redis学习-实战.docx

    Spring Data Redis 是一个简化 Redis 数据访问的框架,提供了丰富的抽象层和工具类,使得开发者可以更加高效地使用 Redis。 - **配置 RedisTemplate**:通过 `RedisConnectionFactory` 和 `RedisTemplate` 类配置...

    基于SpringBoot+Vue的常规应急物资管理系统源码案例设计带文档说明.zip

    SpringBoot是Spring框架的衍生版,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如JPA、RabbitMQ、MongoDB、WebSocket等,使得开发者能够快速创建独立的、生产级别的基于Spring的...

    cxf webservice 应用

    它可以轻松地集成到现有的Spring框架中,并且提供了丰富的工具和插件。然而,对于初学者来说,CXF的学习曲线可能相对较陡,需要一定的学习和实践。 二、CXF与Web服务 2.1 JAX-WS CXF主要通过JAX-WS实现SOAP Web...

    13酒店客房管理系统Java版.docx

    - **框架**: Spring Boot - **数据库**: MySQL - **其他工具**: Maven、Git #### 2.2 技术亮点 - **Spring Boot**: 使用Spring Boot可以快速搭建服务端应用,集成Spring MVC、Spring Data JPA等模块,简化了后端...

    视频点播系统修改.doc

    《视频点播系统修改》——基于Java的毕业设计与MySQL数据库应用 在信息化时代,视频点播(Video On Demand,VOD)系统已经成为人们获取娱乐和教育内容的重要平台。本论文将深入探讨如何利用Java技术对现有的视频...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...

Global site tag (gtag.js) - Google Analytics