一、依賴注入簡介
依賴注入背後的基本原理是對象之間的依賴關係,可以通過以下幾種方式來實現:構造器的參數、Factory 方法的參數。分別是由建構函式或者Factory 方法來建立對象並且設定屬性。因此,容器的主要工作可以理解為建立bean時注入那些依賴關係。相對於由bean自己來控制其執行個體化、直接在構造中指定依賴關係這種自主控制依賴關係注入的方式來說,是從根本上發生了倒轉,因此也稱為控制反轉。
依賴注入主要有兩種方式,即構造器注入和setter注入。
1、構造器注入:
基於構造器的注入是通過調用帶參數的構造器來實現的,每個參數代表一個依賴。
執行個體:
先建立一個對象bean
public class HelloWorld<br />{<br /> private String msg;</p><p> //需要預設無參構造<br /> public HelloWorld(){};</p><p> public HelloWorld(String msg){<br /> this.msg = msg;<br /> }</p><p> public String getMsg(){<br /> return msg;<br /> }</p><p> public void setMsg(String msg){<br /> this.msg = msg;<br /> }<br />}
在修改設定檔applicationContext.xml,執行個體化bean
<bean id="hello" class="com.spring.demo.HelloWorld"><br /> <constructor-arg index="0"><br /> <value>HelloWorld!</value><br /> </constructor-arg><br /></bean>
最後測試是否能得到注入的bean,並列印出對象的屬性。
public static void main(String[] args){<br /> //讀取設定檔,獲得BeanFactory<br /> ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");</p><p> BeanFactory factory = context;</p><p> HelloWorld hello = (HelloWorld)factory.getBean("hello");</p><p> System.out.println(hello.getMsg());<br />}
2、Setter注入
通過調用無參構造器或者無參staticFactory 方法執行個體化bean之後,調用該bean的setter方法,即可實現基於setter的依賴注入
建立一個對象
public class HelloWorld<br />{<br /> private String msg;</p><p> public String getMsg(){<br /> return this.msg;<br /> }</p><p> public void setMsg(String msg){<br /> this.msg = msg;<br /> }<br />}
修改設定檔applicationContext.xml,執行個體化bean
<bean id="helloBean" class="com.spring.demo.HelloWorld"><br /> <property name="msg" value="Hello World !"/><br /></bean>
測試類別,擷取注入的bean
public static void main(String[] args){<br /> //讀取設定檔,執行個體化IOC容器<br /> ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");</p><p> BeanFactory factory = context;</p><p> HelloWorld hello = (HelloWorld)factory.getBean("helloBean");</p><p> System.out.println(hello.getMsg());<br />}<br />
總結:
處理bean依賴關係通常按照以下步驟進行。
1、根據定義bean的配置建立並初始化BeanFactory執行個體
2、每個bean的依賴將以屬性、構造器參數、或靜態Factory 方法參數的形式出現。當這些bean被實際建立時,這些依賴也將會提供給該bean。
3、每個屬性或構造器參數既可以是一個實際的值,也可以是對該容器中另一個bean的引用。
4、每個指定的屬性或者是構造器參數值必須能夠被轉換成特定的格式或構造參數所需的類型。
spring會在容器被建立時驗證容器中每個bean的配置,包括驗證那些bean所引用的屬性是否指向一個有效地bean。在bean被實際建立之前,bean的屬性並不會被設定。伴隨著bean被實際建立,作為該bean的依賴bean以及依賴bean的依賴bean也將被建立和分配。