當前位置:首頁 » 硬碟大全 » spring循環依賴的緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

spring循環依賴的緩存

發布時間: 2022-04-21 00:29:13

『壹』 spring循環依賴及解決方式是什麼

發生在beanA依賴於另一個beanB時,beanB依賴於beanA。

當Spring上下文載入所有bean時,它會嘗試按照它們完全工作所需的順序創建bean。例如,如果我們沒有循環依賴,如下例所示:

A->B->C。

Spring將創建beanC,然後創建beanB(並將bean注入其中),然後創建beanA(並將beanB注入其中)。

但是,當具有循環依賴時,Spring無法決定應該首先創建哪個bean,因為它們彼此依賴。在這些情況下,Spring將在載入上下文時引發。

使用構造函數注入時,它可能發生在Spring中;如果您使用其他類型的注入,則不應該發現此問題,因為依賴項將在需要時注入,而不是在上下文載入時注入。

簡介

Spring是Java EE編程領域的一個輕量級開源框架,該框架由一個叫Rod Johnson的程序員在 2002 年最早提出並隨後創建,是為了解決企業級編程開發中的復雜性,實現敏捷開發的應用型框架。

Spring是一個開源容器框架,它集成各類型的工具,通過核心的Beanfactory實現了底層的類的實例化和生命周期的管理。在整個框架中,各類型的功能被抽象成一個個的 Bean,這樣就可以實現各種功能的管理,包括動態載入和切面編程。

『貳』 spring上的緩存與頁面緩存有什麼作用

@Cacheable(value="accountCache"),這個注釋的意思是,當調用這個方法的時候,會從一個名叫 accountCache 的緩存中查詢,如果沒有,則執行實際的方法(即查詢資料庫),並將執行的結果存入緩存中,否則返回緩存中的對象。這里的緩存中的 key 就是參數 userName,value 就是 Account 對象。「accountCache」緩存是在 spring*.xml 中定義的名稱。
示例:

@Cacheable(value="accountCache")// 使用了一個緩存名叫 accountCache
public Account getAccountByName(String userName) {
// 方法內部實現不考慮緩存邏輯,直接實現業務
System.out.println("real query account."+userName);
return getFromDB(userName);

回答不容易,希望能幫到您,滿意請幫忙採納一下,謝謝 !

『叄』 spring怎麼解決循環依賴

做正常的業務的話很少出現你說的情況。樓主在設計上可能考慮不周。你可以重新修改下各類功能。具體解決辦法還得根據您做的項目來解決。

『肆』 spring為什麼要用redis緩存

首先可以在多台伺服器裝memcached,啟動時分別指定容量和埠
訪問時採用集群方式訪問,只需要spring配置文件裡面配置即可
value可以放任何對象,包括集合
每個鍵值的生命周期可以在放入時獨立設置
類庫可以用spymemcached

數據更新方式可以在後台的定時任務中執行

下面是spring mvc中配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">
<property name="servers" value="伺服器A:埠,伺服器B:埠,伺服器C:埠" />
<property name="protocol" value="BINARY" />
<property name="transcoder">
<bean class="net.spy.memcached.transcoders.SerializingTranscoder">
<property name="compressionThreshold" value="1024" />
</bean>
</property>
<property name="opTimeout" value="2000" />
<property name="timeoutExceptionThreshold" value="1998" />
<property name="locatorType" value="CONSISTENT" />
<property name="hashAlg">
<value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>
</property>
<property name="failureMode" value="Redistribute" />
<property name="useNagleAlgorithm" value="false" />
</bean>

『伍』 Spring緩存,@Cacheable註解的value屬性緩存名稱是個什麼東西

在ehcache.xml裡面配置的cache標簽的name就是這個value值

『陸』 如何在spring中使用緩存

在Spring緩存機制中,包括了兩個方面的緩存操作:1.緩存某個方法返回的結果;2.在某個方法執行前或後清空緩存。
Spring僅僅是提供了對緩存的支持,但它並沒有任何的緩存功能的實現,spring使用的是第三方的緩存框架來實現緩存的功能。其中,spring對EHCache提供了很好的支持。
參考博客:http://www.cnblogs.com/fysola/p/6378400.html

『柒』 spring如何解決循環依賴

首先我們要清楚什麼是循環依賴

意思就是多個bean相互持有對方,比如我們有兩個bean,第一個bean依賴第二個bean,第二個bean也依賴第一個bean。然後一個程序去調用第一個bean的時候,因為第一個bean含有第二個bean的依賴,然後就會去調用第二個bean;再然後第二個bean也有第一個bean的依賴,然後又去調用第一個bean,就這樣一直循環調用

最後spring又是怎麼去解決這樣一個問題的呢?

先是實例化對象,然後賦值,初始化..........正是因為這樣一個生命周期,造成了spring的循環依賴,最後就是spring採用三級緩存來解決他的循環依賴的問題

spring的三級緩存就是三個Map

它是默認關閉的,是mapper級的緩存

三級緩存:存放實例化好的bean

整個的解決循環依賴的流程:

首先到一級緩存的單列中去獲取,如果有就直接返回

如果沒有或者這時候正處於創建過程中,就到二級緩存中去獲取,如果拿到就直接返回

如果沒有拿到,那現在就到了三級緩存了,就是用getObject()從三級緩存中獲取,如果獲取到就把這個移除掉,放到二級緩存中去

『捌』 spring自帶緩存機制怎麼弄

此緩存方法既適用於層,也適用於service層


spring配置文件配置:<!--緩存配置-->
<!--啟用緩存註解功能-->
<cache:annotation-drivencache-manager="cacheManager"/>
<!--spring自己的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供)-->
<beanid="cacheManager"class="org.springframework.cache.support.SimpleCacheManager">
<propertyname="caches">
<set>
<!--此處類concurrentMapCacheFactoryBean的作用是
-->
<beanname="myCache"class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>
</set>
</property>
</bean>service層示例如下:@Transactional(readOnly=true)
@Cacheable(value="myCache")
publicJsonObjectgetWFK(JsonObjectparams){
OneObob=newOneOb();
try{
List<Map<String,Object>>map=LawAssistantMapper.getWFK();
ob.setOb(map);
}catch(Exceptione){
e.printStackTrace();
ob.setCode(500);
ob.setMsg("伺服器錯誤!!!");
returnnewJsonObject(Json.encode(ob));
}
ob.setCode(200);
ob.setMsg("ok");
logger.debug(Json.encode(ob));
returnnewJsonObject(Json.encode(ob));

}

由於使用的是spring自帶的緩存類,所以,僅僅需要兩步:1.在spring配置文件中聲明,2.在service層,方法代碼前增加註解,即可。


缺點:
spring自帶的緩存功能,實質上是通過java類來保存緩存的數據,這樣會佔用一定的內存消耗,並發率越高,對內存的壓力越大。
碼民直接使用的緩存類:org.springframework.cache.support.SimpleCacheManager,org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean

『玖』 Spring是怎麼解決Bean之間的循環依賴的

Spring的循環依賴的理論依據其實是基於Java的引用傳遞,當我們獲取到對象的引用時,對象的field或則屬性是可以延後設置的(但是構造器必須是在獲取引用之前)。
Spring的單例對象的初始化主要分為三步:

(1)createBeanInstance:實例化,其實也就是調用對象的構造方法實例化對象
(2)populateBean:填充屬性,這一步主要是多bean的依賴屬性進行填充
(3)initializeBean:調用spring xml中的init 方法。
從上面講述的單例bean初始化步驟我們可以知道,循環依賴主要發生在第一、第二部。也就是構造器循環依賴和field循環依賴。
那麼我們要解決循環引用也應該從初始化過程著手,對於單例來說,在Spring容器整個生命周期內,有且只有一個對象,所以很容易想到這個對象應該存在Cache中,Spring為了解決單例的循環依賴問題,使用了三級緩存。

『拾』 spring cache redis都緩存什麼數據

首先可以在多台伺服器裝memcached,啟動時分別指定容量和埠 訪問時採用集群方式訪問,只需要spring配置文件裡面配置即可 value可以放任何對象,包括集合 每個鍵值的生命周期可以在放入時獨立設置 類庫可以用spymemcached 數據更新方式可以在後