@Cacheable注解式缓存使用的要点:正确的注解式缓存配置,注解对象为spring管理的hean,调用者为另一个对象。有些情形下注解式缓存是不起作用的:同一个bean内部方法调用,子类调用父类中有缓存注解的方法等。后者不起作用是因为缓存切面必须走代理才有效,这时可以手动使用CacheManager来获得缓存效果。

使用注解式缓存的正确方式:

<cache:annotation-driven cache-manager="springCacheManager" proxy-target-class="false"/>
<bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
<property name="cacheManagerName" value="ehcache"/>
</bean>
<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcacheManager"/>
</bean> 要点:@Cacheable(value="必须使用ehcache.xml已经定义好的缓存名称,否则会抛异常")
@Component
public class CacheBean {
@Cacheable(value="passwordRetryCache",key="#key")
public String map(String key) {
System.out.println("get value for key: "+key);
return "value: "+key;
}
public String map2(String key) {
return map(key);
}
} @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:cache.xml" })
public class CacheTester {
@Autowired CacheManager cacheManager;
@Autowired CacheBean cacheBean;
@Test public void cacheManager() {
System.out.println(cacheManager);
}
@Test public void cacheAnnotation() {
cacheBean.map("a");
cacheBean.map("a");
cacheBean.map("a");
cacheBean.map("a");
System.out.println(cacheManager.getCacheNames());
}
}
输出:
get value for key: a
[authorizationCache, authenticationCache, shiro-activeSessionCache, passwordRetryCache]

稍微改造一下,让ehcache支持根据默认配置自动添加缓存空间,这里提供自定义的MyEhCacheCacheManager即可

<bean id="springCacheManager" class="com.itecheast.ite.domain.util.MyEhCacheCacheManager">
<property name="cacheManager" ref="ehcacheManager"/>
</bean>

另一种改造方式,找不到已定义的缓存空间时不缓存,或者关闭全部缓存。把cacheManagers配置去掉就可以关闭圈闭缓存。

<bean id="springCacheManager" class="org.springframework.cache.support.CompositeCacheManager">
<property name="cacheManagers">
<list>
<bean class="org.springframework.cache.ehcache.EhCacheCacheManager"></bean>
<!-- <bean class="com.itecheast.ite.domain.util.MyEhCacheCacheManager"></bean> 这个会自动创建缓存空间 -->
</list>
</property>
<property name="fallbackToNoOpCache" value="true"/>
</bean>

调用相同类或父类方法没有缓存效果:这时可以选择手动使用CacheManager。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:cache.xml" })
public class CacheTester {
@Test public void cacheAnnotation() {
this.map("a");
this.map("a");
}
@Cacheable(value="passwordRetryCache",key="#key")
public String map(String key) {
System.out.println("get value for key: "+key);
return "value: "+key;
}
}

或者再换一种方式:手动使用代理方式调用同类方法也是可以的

public class CacheBean {
@Autowired ApplicationContext applicationContext;
@Cacheable(value="passwordRetryCache",key="#key")
public String map(String key) { //方法不能为private,否则也没有缓存效果
System.out.println("get value for key: "+key);
return "value: "+key;
}
public String map2(String key) {
CacheBean proxy = applicationContext.getBean(CacheBean.class);
return proxy.map(key); //这里使用proxy调用map就可以缓存,而直接调用map则没有缓存
}
}
本文转自《https://www.xlongwei.com/detail/-cacheable%E6%B3%A8%E8%A7%A3%E5%BC%8F%E7%BC%93%E5%AD%98%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%E7%9A%84%E6%83%85%E5%BD%A2》

@Cacheable注解式缓存不起作用的情形的更多相关文章

  1. Spring Cacheable 注解不缓存null值

    用Cacheable注解时,发现空值,也会被缓存下来.如果我们期望空值不被缓存,可以做如下设置: @Cacheable(key = "#id", unless="#res ...

  2. SpringBoot + redis + @Cacheable注解实现缓存清除缓存

    一.Application启动类添加注解 @EnableCaching 二.注入配置 @Bean public CacheManager cacheManager(RedisTemplate redi ...

  3. @Cacheable注解在spring3中的使用-实现缓存

    转:  http://blog.csdn.net/chenleixing/article/details/44815443 在软件开发中使用缓存已经有一个非常久的历史了.缓存是一种很好的设计思想,一旦 ...

  4. 小白的springboot之路(八)、继承Redis以及@Cacheable注解实现Redis缓存

    0.前言 在项目中,缓存作为一种高效的提升性能的手段,几乎必不可少,Redis作为其中的佼佼者被广泛应用: 一.spring boot集成Redis 1.添加依赖 <dependency> ...

  5. 注解式项目开发!详细解析Java中各个注解的作用和使用方式

    @Target 作用: 指明了修饰的这个注解的使用范围, 即被描述的注解可以用在哪里 @Target(ElementType.Type) ElementType取值的类型: TYPE: 类,接口或者枚 ...

  6. spring mvc + ehcache 利用注解实现缓存功能

    我的spring是3.1的,因为项目需求,需要在查询时候加上缓存,小白一个,完全没有用过缓存(ehcache),摸索了一天终于会了一点通过注解来使用ehcache进行缓存,立刻给记录下来. 首先 我的 ...

  7. 缓存初解(五)---SpringMVC基于注解的缓存配置--web应用实例

    之前为大家介绍了如何使用spring注解来进行缓存配置 (EHCache 和 OSCache)的简单的例子,详见 Spring基于注解的缓存配置--EHCache AND OSCache 现在介绍一下 ...

  8. 缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache

    本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中 ...

  9. 3.2.3 SpringMVC注解式开发

    SpringMVC注解式开发 1. 搭建环境 (1) 后端控制器无需实现接口 , 添加相应注解 Controller类添加注解 @Controller //该注解表将当前类交给spring容器管理 @ ...

随机推荐

  1. 针对UDP丢包问题,进行系统层面和程序层面调优

    转自:https://blog.csdn.net/xingzheouc/article/details/49946191 1. UDP概念 用户数据报协议(英语:User Datagram Proto ...

  2. 最课程阶段大作业之01:使用SVN实现版本控制

    版本控制在友军那里都是放在整个培训的最后阶段才开始讲的,但我们打算放到SE阶段.与其匆匆在项目实战阶段弄个半生不熟,然后进入实际工作中接受他人对你的怀疑,不如……早死早超生~~~. 可是,我们毕竟现在 ...

  3. 关于Python ,requests的小技巧

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xie_0723/article/details/52790786 关于 Python Request ...

  4. spring cloud配置中心属性加密处理

    在现实的场景里,我们会在配置中心配置很多中间件的账号密码(通常都是读写账号),如果采用明文存储将会有很大的风险导致账号泄露,解决方案: http://blog.didispace.com/spring ...

  5. 【Android】详解Android Activity

    目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...

  6. Ubuntu 安装nginx

    https://www.nginx.com/resources/admin-guide/load-balancer/ https://github.com/gplessis/dotdeb-nginx/ ...

  7. Gradle 中 buildConfigField的巧妙应用

    当用AndroidStudio来进行Android项目开发时,build.gradle就是这个工具的核心部分,所有的依赖,debug/release设置,混淆等都在这里进行配置. 下面就主要来记录下利 ...

  8. [转载]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例

    原文地址:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html 前言: 由于Sencha Touch 2 ...

  9. WRI$_ADV_OBJECTS表过大,导致PDB的SYSAUX表空间不足

    现象监控发现sysaux表空间使用不断增加,导致表空间不足 查看过程 查看版本: SQL> select * from v$version; BANNER CON_ID ------------ ...

  10. struts2:表单标签续(datetimepicker标签)

    18. datetimepicker标签 18.1 拷贝JAR包 在struts-2.x.x压缩包的lib目录中拷贝struts2-dojo-plugin-2.3.8.jar到WEB-INF/lib目 ...