什麼是依賴注入,以及爲什麼要使用依賴注入?
簡單的解釋,我們知道,如果我們有兩個java類A和B的話,如果我需要在A中使用B的方法,那麼最尋常的做法是在A類中new一個B類的對象,然後調用這個對象的各種方法。如果只有幾個類還好,直接寫在代碼中就是了,但是如果有幾十個幾百個類呢?各個類之間相互調用。或許你覺得這也沒什麼,但是可怕的地方在於,如果需求變動,需要修改它們之間 的調用關係了,這時候該怎麼辦?沒有一個人願意在幾百個類裏一個一個找,然後一個一個改代碼,這時候,或許你就想到要使用依賴注入技術了。
從名字上理解,所謂依賴注入(Dependency Injection),即組件之間的依賴關係由容器在運行期決定,形象地說,即由容器動態地將某種依賴關係注入到組件之中。DI還有一個名字,叫做控制反轉(IOC),所謂控制反轉,說的就是容器控制程序之間的關係,而非傳統實現中,由程序代碼直接操控。這也就是所謂“控制反轉”的概念所在。控制權由應用代碼中轉到了外部容器,控制權的轉移是所謂反轉。
還是拿上面A和B的例子來說。使用了Spring後,A和B都在Spring的接管之下了,現在A要使用B的方法,但是A並不自己去直接調用B,而是告訴Spring,我需要一個B,你給我吧,然後Spring在自己的配置文件中找到B所對應的java類,返回一個相應的對象給A。如果以後A需要用到別的了,直接向Spring要一個C、D之類的,至於B,C,D是怎麼創建的,A並不關心,A只要知道拿來就能用就可以了。
這個用專業的說法來說,叫做降低了代碼之間的耦合,不同功能的組件並不在自身之內調用其他的組件,不同的組件是依靠Spring以一種鬆散的方式結合在一起的,極大的提高了代碼的靈活性和複用性。
在Spring中的具體實現:
在Spring中,每一個組件(或者說類),都被Spring接管,Spring把它們叫做bean,Spring實例化Bean有三種方式,以下是三種方式的簡要介紹。
1.使用類構造器實例化 [默認的類構造器]
<bean id=“orderService" class="cn.itcast.OrderServiceBean"/>
2.使用靜態工廠方法實例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){ // 注意這裏的這個方法是 static 的!
return new OrderServiceBean();
}
}
3.使用實例工廠方法實例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
往Bean中注入其他的Bean有以下幾種方法:
基本類型對象注入:
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<constructor-arg index=“0” type=“java.lang.String” value=“xxx”/>//構造器注入
<property name=“name” value=“zhao/>//屬性setter方法注入
</bean>
注入其他bean:
方式一
<bean id="orderDao" class="cn.itcast.service.OrderDaoBean"/>
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao" ref="orderDao"/>
</bean>
方式二(使用內部bean,但該bean不能被其他bean使用)
<bean id="orderService" class="cn.itcast.service.OrderServiceBean">
<property name="orderDao">
<bean class="cn.itcast.service.OrderDaoBean"/>
</property>
</bean>
這些是Spring中Bean的簡單配置,更多的詳細配置,可以參考這篇文章。