亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳談@Cacheable不起作用的原因:bean未序列化問題

 更新時間:2022年01月03日 10:35:01   作者:z1014347942  
這篇文章主要介紹了@Cacheable不起作用的原因:bean未序列化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

@Cacheable不起作用的原因:bean未序列化

SpringMVC中將serviceImpl的方法返回值緩存在redis中,發(fā)現(xiàn)@Cacheable失效

是返回的Blogger自定義實體類沒有實現(xiàn)序列化接口

無法存入到redis中。implements一下Serializable接口即可!

@Cacheable注解式緩存不起作用的情形

@Cacheable注解式緩存使用的要點(diǎn):正確的注解式緩存配置,注解對象為spring管理的hean,調(diào)用者為另一個對象。有些情形下注解式緩存是不起作用的:同一個bean內(nèi)部方法調(diào)用,子類調(diào)用父類中有緩存注解的方法等。后者不起作用是因為緩存切面必須走代理才有效,這時可以手動使用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>

要點(diǎn):@Cacheable(value="必須使用ehcache.xml已經(jīng)定義好的緩存名稱,否則會拋異常")

@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支持根據(jù)默認(rèn)配置自動添加緩存空間,這里提供自定義的MyEhCacheCacheManager即可

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

另一種改造方式,找不到已定義的緩存空間時不緩存,或者關(guān)閉全部緩存。把cacheManagers配置去掉就可以關(guān)閉圈閉緩存。

<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> 這個會自動創(chuàng)建緩存空間 -->
?? ??? ?</list>
?? ?</property>
? ? <property name="fallbackToNoOpCache" value="true"/>
</bean>

調(diào)用相同類或父類方法沒有緩存效果:這時可以選擇手動使用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;
?? ?}
}

或者再換一種方式:手動使用代理方式調(diào)用同類方法也是可以的

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調(diào)用map就可以緩存,而直接調(diào)用map則沒有緩存
?? ?}
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)批量操作Excel的示例詳解

    Java實現(xiàn)批量操作Excel的示例詳解

    在操作Excel的場景中,通常會有一些針對Excel的批量操作,以GcExcel為例,為大家詳細(xì)介紹一下Java是如何實現(xiàn)批量操作Excel的,需要的可以參考一下
    2023-07-07
  • Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    這篇文章主要為大家介紹了Java開啟JMX遠(yuǎn)程監(jiān)控的服務(wù)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MultipartFile文件判斷是否存在的操作

    MultipartFile文件判斷是否存在的操作

    這篇文章主要介紹了MultipartFile文件判斷是否存在的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Effective Java (異常處理)

    Effective Java (異常處理)

    Effective Java (異常處理),需要的朋友可以參考一下
    2013-02-02
  • java實現(xiàn)折半排序算法

    java實現(xiàn)折半排序算法

    折半插入排序法,又稱二分插入排序法,是直接插入排序法的改良版,也需要執(zhí)行i-1趟插入,不同之處在于,第i趟插入,先找出第i+1個元素應(yīng)該插入的的位置,假定前i個數(shù)據(jù)是已經(jīng)處于有序狀態(tài)。
    2015-04-04
  • Java實現(xiàn)部門員工管理

    Java實現(xiàn)部門員工管理

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)部門員工管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 解析MapStruct轉(zhuǎn)換javaBean時出現(xiàn)的詭異事件

    解析MapStruct轉(zhuǎn)換javaBean時出現(xiàn)的詭異事件

    在項目中用到了MapStruct,對其可以轉(zhuǎn)換JavaBean特別好奇,今天小編給大家分享一個demo給大家講解MapStruct轉(zhuǎn)換javaBean時出現(xiàn)的詭異事件,感興趣的朋友一起看看吧
    2021-09-09
  • SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解

    SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解

    這篇文章主要介紹了SpringMVC通過Ajax處理Json數(shù)據(jù)的步驟詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 必須了解的高階JAVA枚舉特性!

    必須了解的高階JAVA枚舉特性!

    這篇文章主要介紹了必須了解的高階JAVA枚舉特性!幫助大家更好的理解和學(xué)習(xí)Java枚舉的相關(guān)知識,感興趣的朋友可以了解下
    2021-01-01
  • Java中常用緩存Cache機(jī)制的實現(xiàn)

    Java中常用緩存Cache機(jī)制的實現(xiàn)

    這篇文章主要介紹了Java中常用緩存Cache機(jī)制的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評論