在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相...