Spring中的依賴注入

什麼是依賴注入,以及爲什麼要使用依賴注入?

簡單的解釋,我們知道,如果我們有兩個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=“0type=“java.lang.Stringvalue=“xxx/>//構造器注入
    <property name=“namevalue=“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的簡單配置,更多的詳細配置,可以參考這篇文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章