spring方法注入
spring核心現成可用,有兩個作用域:單例和原型。 單例實現單例模式,這意味著在執行時(在jvm中)只有乙個例項。 spring在上下文建立期間例項化它們,將它們快取在上下文中,並在需要時(或類似的東西)從快取中提供它們。 每次訪問上下文以獲取bean時都會例項化原型。
當需要在單例範圍的bean中注入原型範圍的bean時,會出現問題。 由於單例是在上下文建立期間建立(然後注入)的:這是唯一一次訪問spring上下文,因此原型作用域的bean僅注入一次,因此無法實現它們的目的。
為了將原型注入單例中,並通過setter和建構函式注入併排進行syde,spring提出了另一種注入方法,稱為方法注入。 它的工作方式如下:由於單例是在上下文建立時例項化的,因此它改變了原型作用域的處理方式,從注入到通過抽象方法建立。 以下**段顯示了實現注入的不成功方法:
public
class
singleton
public
void
dosomething
()public
void
dosomethingelse
()}
public
abstract
class
singleton
public
void
dosomethingelse
()}
如您所見,**沒有指定createprototype()實現。 此職責委託給spring,因此需要以下配置:
id=
"prototype"
class=
"ch.frankel.blog.prototype"
scope=
"prototype"
/>
id="singleton"
class=
"sample.mysingleton"
>
name=
"createprototype"
bean=
"prototype"
/>
注意,方法注入的替代方法是顯式訪問spring上下文以自己獲取bean。 這樣做是一件壞事,因為它完全擊敗了整個inversion of control模式,但它確實有效(並且在伺服器上發生討厭的錯誤時,它實際上是唯一的選擇-參見下文)。
但是,使用方法注入有幾個主要限制:
翻譯自:spring方法注入
Spring 方法注入
1 spring利用了cglib庫在執行時生成二進位制 功能,通過動態建立lookup方法bean的子類而達到複寫lookup方法的目的。例 建立乙個抽象類 public abstract class commandmanager protected abstract command createc...
spring 方法注入 lookup方法注入
1 無狀態bean 與有狀態bean 無狀態bean bean一旦例項化就被加進會話池中,各個使用者都可以共用。即使使用者已經消亡,bean 的生命期也不一定結束,它可能依然存在於會話池中,供其他使用者呼叫。有狀態bean 有狀態會話bean 每個使用者有自己特有的乙個例項,在使用者的生存期內,be...
Spring的方法注入
spring中無狀態的bean的作用域一般可配置為單例模式,如果我們往單例模式的a中注入乙個prototype的型別b,並希望每次呼叫getb 時都能返回乙個新的b,傳統的注入方式就無法達到這樣的要求。原因是單例的bean注入關聯bean的動作只有一次,雖然b的型別是prototype,但每次返回的...