`

Spring使用Cache(三)

 
阅读更多

2       配置SpringCache的支持

2.1     声明对Cache的支持

2.1.1  基于注解

       配置Spring对基于注解的Cache的支持,首先我们需要在Spring的配置文件中引入cache命名空间,其次通过<cache:annotation-driven />就可以启用Spring对基于注解的Cache的支持。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:cache="http://www.springframework.org/schema/cache"

   xsi:schemaLocation="http://www.springframework.org/schema/beans

     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

     http://www.springframework.org/schema/cache

     http://www.springframework.org/schema/cache/spring-cache.xsd">

 

   <cache:annotation-driven/>

 

</beans>

 

       <cache:annotation-driven/>有一个cache-manager属性用来指定当前所使用的CacheManager对应的bean的名称,默认是cacheManager,所以当我们的CacheManageridcacheManager时我们可以不指定该参数,否则就需要我们指定了。

       <cache:annotation-driven/>还可以指定一个mode属性,可选值有proxyaspectj。默认是使用proxymodeproxy时,只有缓存方法在外部被调用的时候Spring Cache才会发生作用,这也就意味着如果一个缓存方法在其声明对象内部被调用时Spring Cache是不会发生作用的。而modeaspectj时就不会有这种问题。另外使用proxy时,只有public方法上的@Cacheable等标注才会起作用,如果需要非public方法上的方法也可以使用Spring Cache时把mode设置为aspectj

       此外,<cache:annotation-driven/>还可以指定一个proxy-target-class属性,表示是否要代理class,默认为false。我们前面提到的@Cacheable@cacheEvict等也可以标注在接口上,这对于基于接口的代理来说是没有什么问题的,但是需要注意的是当我们设置proxy-target-classtrue或者modeaspectj时,是直接基于class进行操作的,定义在接口上的@CacheableCache注解不会被识别到,那对应的Spring Cache也不会起作用了。

       需要注意的是<cache:annotation-driven/>只会去寻找定义在同一个ApplicationContext下的@Cacheable等缓存注解。

 

2.1.2  基于XML配置

       除了使用注解来声明对Cache的支持外,Spring还支持使用XML来声明对Cache的支持。这主要是通过类似于aop:advicecache:advice来进行的。在cache命名空间下定义了一个cache:advice元素用来定义一个对于Cacheadvice。其需要指定一个cache-manager属性,默认为cacheManagercache:advice下面可以指定多个cache:caching元素,其有点类似于使用注解时的@Caching注解。cache:caching元素下又可以指定cache:cacheablecache:cache-putcache:cache-evict元素,它们类似于使用注解时的@Cacheable@CachePut@CacheEvict。下面来看一个示例:

   <cache:advice id="cacheAdvice" cache-manager="cacheManager">

      <cache:caching cache="users">

         <cache:cacheable method="findById" key="#p0"/>

         <cache:cacheable method="find" key="#user.id"/>

         <cache:cache-evict method="deleteAll" all-entries="true"/>

      </cache:caching>

   </cache:advice>

 

       上面配置定义了一个名为cacheAdvicecache:advice,其中指定了将缓存findById方法和find方法到名为users的缓存中。这里的方法还可以使用通配符“*”,比如“find*”表示任何以“find”开始的方法。

       有了cache:advice之后,我们还需要引入aop命名空间,然后通过aop:config指定定义好的cacheAdvice要应用在哪些pointcut上。如:

   <aop:config proxy-target-class="false">

      <aop:advisor advice-ref="cacheAdvice" pointcut="execution(* com.xxx.UserService.*(..))"/>

   </aop:config>

       上面的配置表示在调用com.xxx.UserService中任意公共方法时将使用cacheAdvice对应的cache:advice来进行Spring Cache处理。更多关于Spring Aop的内容不在本文讨论范畴内。

 

2.2     配置CacheManager

       CacheManagerSpring定义的一个用来管理Cache的接口。Spring自身已经为我们提供了两种CacheManager的实现,一种是基于Java APIConcurrentMap,另一种是基于第三方Cache实现——Ehcache,如果我们需要使用其它类型的缓存时,我们可以自己来实现SpringCacheManager接口或AbstractCacheManager抽象类。下面分别来看看Spring已经为我们实现好了的两种CacheManager的配置示例。

2.2.1  基于ConcurrentMap的配置

   <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">

      <property name="caches">

         <set>

            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="xxx"/>

         </set>

      </property>

   </bean>

       上面的配置使用的是一个SimpleCacheManager,其中包含一个名为“xxx”的ConcurrentMapCache

 

2.2.2  基于Ehcache的配置

   <!-- Ehcache实现 -->

   <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheManager"/>

   <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache-spring.xml"/>

       上面的配置使用了一个Spring提供的EhCacheCacheManager来生成一个SpringCacheManager,其接收一个EhcacheCacheManager,因为真正用来存入缓存数据的还是EhcacheEhcacheCacheManager是通过Spring提供的EhCacheManagerFactoryBean来生成的,其可以通过指定ehcache的配置文件位置来生成一个EhcacheCacheManager。若未指定则将按照Ehcache的默认规则取classpath根路径下的ehcache.xml文件,若该文件也不存在,则获取Ehcache对应jar包中的ehcache-failsafe.xml文件作为配置文件。更多关于Ehcache的内容这里就不多说了,它不属于本文讨论的内容,欲了解更多关于Ehcache的内容可以参考我之前发布的Ehcache系列文章,也可以参考官方文档等

分享到:
评论

相关推荐

    springboot 使用spring cache缓存 和 使用fastjson配置redis系列化

    在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合Fastjson配置Redis序列化,确保数据正确存储和读取。 首先,我们需要在`pom.xml`中添加必要的依赖。Spring Boot的`spring-boot-starter-cache`模块...

    spring-cache(通过key值更新缓存)

    Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...

    spring-cache.xsd+spring-encache.xsd

    标题中的"spring-cache.xsd+spring-encache.xsd"提到了两个XML Schema定义文件,它们是Spring框架中用于缓存管理的配置规范。Spring框架是一个广泛应用的Java企业级应用开发框架,它提供了多种功能,包括但不限于...

    springboot使用springCache和不使用springCache的对比.zip

    本项目通过对比使用和不使用Spring Cache注解来探讨其作用和效果。 1. **@Cacheable**: 这个注解用于方法上,表示该方法的结果可以被缓存。当调用一个标记为@Cacheable的方法时,Spring会检查缓存中是否存在相同...

    spring-cache-4.1.xsd

    spring-cache-4.1.xsd用于spring开发代码提示。用于Java开发。

    springcache+redis springboot maven

    在这个项目中,"springcache+redis"的整合意味着我们要利用Spring Cache的特性,将缓存存储在Redis中,以提升应用的性能。 首先,Spring Cache提供了`@Cacheable`、`@CacheEvict`和`@Caching`等注解,允许我们在...

    (SSM框架)memcached整合Spring基于Cache注解.

    在MyBatis的Mapper接口方法上使用Spring的Cache注解,实现查询结果的缓存。 8. **性能优化**: 使用Memcached需要注意缓存穿透、缓存雪崩和缓存击穿等问题。可以通过设置合理的过期时间、使用布隆过滤器防止穿透、...

    Redis整合SpringCache实例

    **Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...

    SSM与memcached整合项目Spring Cache

    4. **启用Spring Cache**:在Spring配置文件中,使用`@EnableCaching`注解启用缓存功能。 5. **使用注解**:在业务逻辑的方法上使用`@Cacheable`、`@CacheEvict`和`@CachePut`注解,指定缓存的名称和键生成策略。...

    spring-cache-4.2.xsd.zip

    这个文件对于理解Spring Cache的配置以及在离线环境中使用Spring框架是至关重要的。 首先,我们需要了解Spring Cache。Spring Cache是Spring框架的一个模块,它提供了一种统一的缓存抽象,支持多种缓存实现,如 ...

    SpringCache与redis集成,优雅的缓存解决方案.docx

    使用SpringCache与Redis集成的优雅缓存解决方案,可以大大减少编写模板代码的工作量,提高应用程序的开发效率。同时,它还可以提高应用程序的性能,减少数据库压力。 SpringCache与Redis集成的优雅缓存解决方案是一...

    Spring cache

    Spring Cache 是 Spring 3.1 版本引入的一项重要特性,它不是一种具体的缓存实现(如 EHCache 或 OSCache),而是一种缓存使用的抽象层。通过在现有的业务代码上添加特定的注解,可以轻松地为方法调用添加缓存支持。...

    jar包-spring-modules-cache.jar

    总之,`spring-modules-cache.jar`中的Spring Modules Cache是Spring框架的一个强大补充,它简化了缓存的管理和使用,帮助开发者构建高性能、易维护的Java应用。无论是在单体应用还是微服务架构中,这个库都能发挥...

    spring cache + redis 主从

    三、整合Spring Cache功能 Spring Cache是一个抽象层,提供了与缓存技术交互的机制,它与特定的缓存解决方案无关。 1. 依赖配置: - 在项目的pom.xml文件中添加Spring Data Redis的依赖。 2. 配置Spring Cache:...

    springCache

    通过 Spring Cache,开发者可以方便地在方法级别启用或禁用缓存,简化了缓存的管理和使用。 首先,让我们深入了解 Spring Cache 的核心概念和配置: 1. **注解驱动**:Spring Cache 提供了 `@Cacheable`、`@...

    redis-cluster和spring集成,基于cache注解

    综上所述,"redis-cluster和spring集成,基于cache注解" 的项目是一个使用 Spring Cache 集成 Redis 集群的实例,旨在通过注解的方式简化缓存管理,提高应用性能。开发者可以通过导入提供的项目,快速了解和实践这一...

    spring-cache

    spring-cache-3.5.0工具包,Java开发一般能用上,缓存工具

    spring-cache-mongodb:基于MongoDB的Spring Cache实现

    5. **MongoDB集成**:在Spring Cache中使用MongoDB作为缓存存储,需要配置MongoDB的连接信息,并使用Spring Data MongoDB提供的库来与数据库交互。这通常涉及到`MongoTemplate`或`MongoRepository`的使用。 6. **...

    spring cache

    spring cacke spring cacke

Global site tag (gtag.js) - Google Analytics