依賴的處理過程
容器解決依賴的過程
對於每個bean,它的依賴關係以屬性,構造函式引數或靜態工廠方法(如果不是用正常的建構函式)的引數的形式表示,當實際建立bean的時候,它的依賴被提供
每個屬性或者構造函式引數被設定乙個實際值或引用bean容器裡的其他bean
每個屬性的值或者構造函式引數的值根據描述資訊轉化成屬性或者構造函式引數實際的型別.預設情況下,spring可以把乙個字串格式的值轉換成所有的內建的型別,如int,long,string,boolen等.
spring容器在容器建立時驗證每個bean的配置.但是,在實際建立 bean之前,bean屬性本身不會被設定.當容器建立的時候單例的bean被預先例項化(預設情況下).作用域定義在 bean 作用域.否則,只有在請求時才建立bean.建立乙個bean可能會導致一系列的bean被建立,因為bean的依賴關係及其依賴關係的依賴關係(等等)被建立和分配.注意到依賴不匹配的處理晚點會說明.
迴圈依賴
如果你主要使用建構函式方式注入,你可能會碰到乙個無法解析的迴圈依賴場景,比如類a需要類b的例項,通過建構函式注入.類b需要類a的例項,也是通過建構函式注入.如果將類a和b的bean配置為相互注入,則spring ioc容器會在執行時檢測到此迴圈引用,並引發乙個 beancurrentlyincreationexception
解決的辦法時修改**,配置成setter方法注入而不是通過建構函式注入,或者避免建構函式注入而僅使用setter方法注入,簡單來說就是用setter方法注入來配置乙個迴圈依賴
與典型情況(沒有迴圈依賴)不同,bean a和bean b之間的迴圈依賴關係迫使其中乙個bean在被完全初始化之前注入另乙個bean(經典的雞/雞蛋場景)
依賴注入例子
下面是基於setter方法的依賴注入例子
"examplebean"
class
="example.examplebean"
>
<
!-- setter injection using the nested ref element --
>
"beanone"
>
"anotherexamplebean"
/>
<
/property>
<
!-- setter injection using the neater ref attribute --
>
"beantwo" ref=
"yetanotherbean"
/>
"integerproperty" value=
"1"/
>
<
/bean>
"anotherexamplebean"
class
="examples.anotherbean"
/>
"yetanotherbean"
class
="examples.yetanotherbean"
/>
public
class
examplebean
public
void
setbeantwo
(yetanotherbean beantwo)
public
void
setintegerproperty
(int i)
}
前面例子是setters方法被宣告為xml檔案中指定的屬性相匹配,下面例子是基於建構函式依賴注入
"examplebean"
class
="examples.examplebean"
>
<
!-- constructor injection using the nested ref element --
>
"anotherexamplebean"
/>
<
/constructor-arg>
<
!-- constructor injection using the neater ref attribute --
>
"yetanotherbean"
/>
"int" value=
"1"/
>
<
/bean>
"anotherexamplebean"
class
="examples.anotherbean"
/>
"yetanotherbean"
class
="examples.yetanotherbean"
/>
public
class
examplebean
}
在bean定義裡描述的constructor-arg會被當作examplebean建構函式的引數
替換使用建構函式,使用靜態工廠方法返回乙個例項物件
"examplebean"
class
="examples.examplebean" factory-method=
"createinstance"
>
"anotherexamplebean"
/>
"yetanotherbean"
/>
"1"/
>
<
/bean>
"anotherexamplebean"
class
="examples.anotherbean"
/>
"yetanotherbean"
class
="examples.yetanotherbean"
/>
public
class
examplebean
// a static factory method; the arguments to this method can be
// considered the dependencies of the bean that is returned,
// regardless of how those arguments are actually used.
public
static examplebean createinstance (
anotherbean anotherbean, yetanotherbean yetanotherbean,
int i)
}
給靜態工廠方法提供引數通過元素,就像實際使用建構函式一樣.靜態工廠方法返回的型別,不是必須與靜態工廠方法所在的類一樣,儘管我們的例子是這樣子的.例項(非靜態)工廠方法將以基本相同的方式使用(除了使用factory-bean屬性而不是class屬性之外),因此在此不討論細節 springIOC容器詳解
springioc容器又被搞了,我tm今天要搞定這個東西 我目前看過最好的講解是這篇作者的 spring的ioc容器在實現控制反轉和依賴注入的過程中,可以劃分為兩個階段 這兩個階段中,ioc容器分別作了以下這些事情 2 ioc容器及ioc容器如何獲取物件間的依賴關係 spring中提供了兩種ioc容...
Spring Ioc容器詳解(三)
在pom.xml新增spring依賴 org.springframework groupid spring context artifactid version dependency org.springframework groupid spring beans artifactid versio...
手寫spring IOC容器
基本思路 解析xml配置檔案 根據配置的生成相應的物件 將物件存入ioc容器 ioc容器實現 1.0 encoding utf 8 address class com.example.xmlsax reader.entity.address city value fuzhou user class ...