2 5 協調作用域不同步的Bean

2021-08-07 15:08:02 字數 1677 閱讀 8134

在spring容器中,最常見的為singleton與prototype作用域的bean,當我們多次獲取singleton作用域的bean時,得到的都是同乙個例項,而prototype作用域裡則每次都產生乙個新的bean例項。我們知道,spring容器在初始化某個bean前,先會建立被依賴的bean,然後再對該bean進行初始化,如果此時為singleton作用域的bean依賴prototype作用域的bean,由於singleton作用域的bean只初始化一次,故prototype作用域的bean也只被注入一次,之後我們每次通過singleton bean去訪問prototype bean時,得到的永遠是最初的那個prototype bean,也可以理解為singleton bean把它所依賴的prototype bean變成了singleton,這就違背了我們設定prototype bean的初衷。

有以下兩種解決思路:

不建議使用第一種方法,因為此做法會導致程式**與spring api耦合,造成**汙染。使用lookup方法注入可以讓spring容器重寫容器中呼叫者bean的抽象或具體方法,返回查詢容器中其他bean的結果。為了使用lookup方法注入,大致需要如下兩步

以下給出demo:

beans.xml部分**

id="chinese"

class="spring例項.chinese" >

name="getdog"

bean="dog"/>

bean>

id="dog"

class="spring例項.dog"

scope="prototype">

name="name"

value="柯基">

property>

bean>

定義呼叫者bean的實現類chinese類為抽象類,並定義抽象方法getdog()

public

abstract

class

chinese

implements

person

}

dog類

public

class dog

public

void

setname(string name)

public

void

run()

}

主程式部分**

chinese c=ctx.getbean("chinese", chinese.class);

c.hunt();

c.hunt();

執行結果

我帶著id為:spring例項.dog@1b279c9出去打獵

名為[柯基]的小狗不要命地跑!

我帶著id為:spring例項.dog@d282e0出去打獵

名為[柯基]的小狗不要命地跑!

執行結果顯示,每次通過chinese例項呼叫getdog()方法,都會返回新的dog例項。這裡補充一下,實質上spring實現方法的邏輯是固定的,如下**:

public dog getdog()

協調作用域不同步的Bean

如果在依賴注入的時候出現這麼乙個情況 乙個singleton bean需要依賴注入乙個prototype bean,如果不採用任何手段,直接注入的話,將會出現這樣乙個結果 每次建立singleton bean例項時,獲取的prototype bean例項也是相同的,從而在使用來看prototype ...

協調作用域不同步的Bean

當spring容器中作用域不同的bean相互依賴時,可能出現一些問題 當兩個singleton作用域bean存在依賴關係時,或當prototype作用域bean依賴singleton作用域bean時,通過屬性定義依賴關係就足夠了。但當singleton作用域bean依賴prototype作用域bea...

Bean的作用域

bean元素有乙個scope屬性,用於定義bean的作用域,該屬性有如下五個值 1 singleton 單例模式,在整個spring ioc容器中,單例模式作用域的bean都將只生成乙個例項。一般spring容器預設bean的作用域為singleton 2 prototype 與singleton相...