遇到的問題爲:給某個查詢方法添加了@Cacheable註解,Junit測試通過,查詢方法執行多次時只有第一次執行方法體,之後調用方法查詢緩存,不進入方法體;但是在Controller內調用的時候多次調用發現每次都進入方法體,不走緩存。
查網上的解決辦法大多爲以下兩種:
1、由於@Cacheable基於SpringAOP的動態代理機制,程序執行時會在代理的方法前做緩存處理,但是如果一個類(比如一個加了@Service註解的)內部方法A調用內部的@Cacheable方法B,則會直接調用方法不會進行相應的處理。解決辦法是把A、B兩個方法放進不同的Service中。
2、不採用註解的方式,直接採用編程方式,取到 Ehcache 的 CacheManger 對象,把需要緩存的數據放到裏面,類似於使用 Map,緩存的邏輯自己控制;或者可以使用redis的緩存方式去添加緩存。
遇到的問題非如上兩種,僅做記錄。
解決辦法
經過反覆嘗試,發現需要把ehcache的註解開關配置到application-context.xml和servlet-spring.xml也就是springmvc的配置文件裏。如果只在context裏面配置,那麼只有Junit測試的時候緩存纔會生效。具體原因還沒搞清楚...
添加配置如下:
<cache:annotation-driven cache-manager="cacheManager"/>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<property name="cacheManager" ref="ehcache"/>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<property name="configLocation" value="classpath:ehcache.xml"/>
</bean>