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