开发者社区> 问答> 正文

Spring配置Ehcache缓存 : 配置报错 

因为会在内部使用this  调用@Cacheable 标记的方法 而基于 proxy 的 AOP 模式 这种情况不会使用缓存,而直接查询;然后配置了如下的
<!--  缓存  属性-->  
    <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
        <property name="configLocation"  value="classpath:ehcache.xml"/>   
    </bean> 
    
    <!-- 默认是cacheManager -->  
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
    	p:cacheManager-ref="cacheManagerFactory">    
    </bean> 

	<!-- 支持缓存注解 -->
    <cache:annotation-driven cache-manager="cacheManager" mode="aspectj" proxy-target-class="true"/>
内部调用的时候还是不能使用缓存;求解答啊 

展开
收起
kun坤 2020-06-03 15:46:25 493 0
1 条回答
写回答
取消 提交回答
  • 先吐槽下楼主的表达能力。。
    给你两点SpringCache的tips:
    1. 缓存注解只对public方法有效,其他类型均无效 2. 在Spring代理模式下对象内部自己调用@Cacheable方法不会使用Cache

    解决办法嘛,从设计上分离对象的功能就OK了 ######回复 @阿斯兰 : cache我用的少,我总觉的理解的还有不到位的,但我那种方法是“懒人”方法,保证OK######回复 @景愿 : 喔喔,我还以为是专门针对我这种问题的;那我就分离吧! 谢谢 景愿 同学啦!######回复 @阿斯兰 : mode是表示使用代理方式创建bean还是直接修改字节码的方式来完成创建相应功能的bean,有两个选项:proxy/aspectj######回复 @阿斯兰 : 具体配置什么意思就要看官方文档了,一般我都用默认的。我简单的看了下,这两个配置对你想要的功能没有任何帮助,是指代理模式的区别,用 class-based proxies还是standard JDK interface-based proxies的区别######嘿嘿,有点急没怎么酝酿 我已经知道代理模式下内部调用会无效(查资料发现啦),只是发现 mode="aspectj" proxy-target-class="true" 设置;查资料说该方式下可以解决 但是配置测试了下依然没解决 请问这句话在什么情况下添加呢?######aspectj######回复 @阿斯兰 : 如果不指定aspectj的话,spring会使用自己的aop实现。此时@Cacheable不支持内部方法调用######回复 @阿斯兰 : 使用aspectj替换spring默认的aop实现即可######具体怎么做?######同样遇到这个问题,怎么解决的?######我是把需要用this调用的方法分离出去了,写在另一个类 这边再调用就好了###### 也遇到同样的问题, 查到最多的就是说把mode改为aspectj就OK,但我实验也不行。 
    不知道那些这样回答的,是不是人云亦云,自己没有做过测试 ###### aspect会将增强代码切入到字节码里面,所以可以解决这个问题。
    mode改为aspectj后依赖spring-aspects的jar包。
    但是我也没成功,呵呵。另入后bean都没代理了。没任何反应。郁闷 ######可以贴一下你的ehcache.xml 和 你的缓存代码注解吗?

    2020-06-04 10:58:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多