通俗化理解Spring3 IoC的原理和主要組件(spring系列知識二總結)

♣什麼是IoC?html

♣通俗化理解IoC原理java

♣IoC好處程序員

♣工廠模式web

♣IoC的主要組件spring

♣IoC的應用實例app

♣附:實例代碼框架

 

1.什麼是IoC(控制反轉)?單元測試

Spring3框架的核心是實現控制反轉(IoC)模式,IoC又叫作依賴注入(DI)。
測試

什麼是控制反轉呢?答案就是「得到依賴對象的過程被反轉了」,得到依賴對象的過程由自身管理對象變爲由IoC容器主動注入,因而控制反轉又叫作依賴注入。那麼「控制反轉」徹底就是「依賴注入」咯?其實,咱們能夠將「控制反轉」理解爲名詞,將「依賴注入」理解爲動詞,因此「依賴注入」用來實現「控制反轉」的一種方法、手段。依賴注入就是由IoC容器在運行期間,動態地將某種依賴關係注入到對象之中,最終實現對象之間的解耦spa

通俗形象地理解依賴注入的過程:舉計算機(對象A),usb設備(對象B),人(IoC容器)的例子。以下:

利用計算機(對象A)和usb接口實現:計算機(對象A)從usb設備中讀取文件的任務。特色:1.計算機(對象A)不用關心鏈接的外部設備是什麼,好比是u盤仍是移動硬盤,計算機(對象A)只能被動接受;2.usb設備(對象B)只要符合usb的標準就ok了;3.當計算機(對象A)須要外部usb設備的時候,不用說出來,人(IoC容器)會自動幫它掛上。這就是usb設備(對象B)在系統運行時被注入到計算機(對象A)的過程。

 

因而可知,對象A依賴於對象B,當對象A須要用到對象B的時候,IoC容器就會當即建立一個對象B給對象A。IoC容器就是一個對象製造工廠,你須要什麼,給你製造好而後送給你,你什麼都不用管,包括對象是如何生成和銷燬的。

2.通俗化理解IoC原理

 上面已經介紹了什麼是控制反轉,如今再進一步囉嗦一下。控制反轉的原理就是:由容器來控制程序之間的關係(之前是有程序代碼直接操控,即在一個類中調用另一個類,也就是要用到某個類的時候才手動用代碼new 一個這個類的對象出來),「反轉」的意思就是「控制權」的轉移,控制權由應用代碼中轉到外部容器。

  下面舉個通俗的齒輪例子來講明爲何要使用IoC容器來控制程序之間的關係(若是不懂什麼是「解耦」,看了這個例子你就明白了):

  1.從下面的圖能夠看出,相互齧合的A、B、C、D四個齒輪組成一個齒輪組,用來完成某項任務。可是,若是有一個齒輪出了問題,就頗有可能影響整個齒輪組的正常運轉。

    咱們能夠把齒輪組中的齒輪之間的關係,類比爲軟件系統中對象之間的耦合關係。對象之間的耦合是沒法避免的,由於這是協同合做的基礎。但隨着軟件的規模愈來愈來,好比一些工業級的軟件,那麼對象之間的依賴關係也會至關複雜,常常會出現對象之間的多重依賴性關係。耦合度太高,結果就會致使「牽一髮而動全身」的情形。因此,爲了實現對象之間的「解耦」,提出了IoC理論。

   2.引入IoC容器,充當「黏合劑」的做用,使得A、B、C、D四個齒輪(對象)沒有了解耦關係,這樣程序員就可以更好地分工開發各個模塊了。

3.IoC好處

  這裏仍是繼續使用計算機和u盤的例子來簡單說明:

  1.方便解耦,簡化開發:計算機和u盤之間沒有相關性,不管哪一個出現問題都不會影響另外一方。並且,由於這兩種組件之間的無耦合,因此生成計算機的廠商和生成u盤的廠商能夠不一樣。這樣的話就可以更好的分工開發了。

  2.易於測試:由於計算機和u盤之間的無關性,因此很是便於單元測試,分開調試和診斷。這符合spring一直貫徹的「好的設計優於具體實現,代碼應易於測試」的理念。

 4.工廠模式

  工廠模式,顧名思義就是社會工業化帶來的產品生產分工。這裏的工廠指的是專門生產對象的地方,也就是聲明一個類做爲工廠(工廠類)用來生成其餘類的實例對象。

  舉個例子:A組件須要B組件的協助時,不用A組件本身去實例化B組件,而是經過生產B組件的工廠(beanFactory)獲取。

 

  下面用一個factoryexample的例子來體會下:

  

 接口person類的代碼:Person.java

package factoryexample;

public interface Person {
    void eat();//定義抽象的吃方法
    void drink();//定義抽象的喝方法
}

 實現接口類的代碼:

 Chinese類:Chinese.java

package factoryexample;

public class Chinese implements Person{
    public void eat()
    {
        System.out.println("中國人喜歡吃中餐!");
    }
    public void drink()
    {
        System.out.println("中國人喜歡喝開水!");
    }
}

 American類:American.java

package factoryexample;

public class American implements Person{
    public void eat()
    {
        System.out.println("美國人喜歡吃西餐!");
    }
    public void drink()
    {
        System.out.println("美國人喜歡喝咖啡!");
    }
}

 工廠類:Factory.java

package factoryexample;

public class Factory {
    public Person getPerson(String name)
    {
        if(name.equals("中國人"))
            return new Chinese();
        else if(name.equals("美國人"))
           return new American(); 
        else
            throw new IllegalArgumentException("參數不正確!");        
    }
}

 測試類:Test.java

package factoryexample;

public class Test {
    public static void main(String[] args) {
        Person person=null;
        person=new Factory().getPerson("中國人");
        person.eat();
        person.drink();
        person=new Factory().getPerson("美國人");
        person.eat();
        person.drink();    
    }
}

  運行結果:

 

 

 

  上面的factoryexample這個例子是用一個factory類來作對象建立的工做,在spring IoC中,咱們就使用IoC容器來完成對象的建立,具體代碼看iocexample這個例子,iocexample例子的代碼在文章最後的附件資源裏。

 5.IoC的主要組件

   Spring3框架的兩個最基本和最重要的包:

  1.org.springframework.beans.factory包(該包的主要接口是BeanFactory)

  2.org.springframework.context包(該包的主要接口是ApplicationFactory)

 

  SpringIoC框架主要組件以下:

  (1).Beans

  (2).配置文件(beans.xml或applicationContext.xml)

  (3).BeanFactory接口及其相關類

  (4).ApplicationContext接口及其相關類

 

  使用iocexample2例子來理解 SpringIoC框架四個主要組件:

  (1).Beans

   Beans是指項目中提供業務的Bean,及容器要管理的Bean,如上面介紹的Chinese.java和American.java就是javaBean 。 Bean能夠包含一些屬性以及屬性對應的getter和setter方法,也能夠包含其餘方法。

  (2).配置文件(beans.xml或applicationContext.xml)

  Spirng3經過配置文件來管理Bean,編輯配置文件這個動做又叫作「裝配bean」,裝配bean實際就是告訴容器須要哪些bean,以及容器如何使用IoC將它們配置起來。

  配置文件包含:Bean的id、類、屬性及其值; 一個<beans>元素和數個<bean>子元素。

  Spring IoC框架根據Bean的id從Bean配置文件中取得該Bean的類,並生成該類的一個對象,繼而從配置文件中獲取該對象的屬性和值。

  下面是iocexample2例子的類圖:

  下面是iocexample2例子的配置文件(applicationContext.xml):下面的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]>

<beans>
    <!--配置Bean,注入Chinese類對象-->
    <bean id="中國人" class="iocexample2.Chinese">
        <!--property元素用來指定須要容器注入的屬性;name元素的指定屬性值language;
        ref元素指定須要向language屬性注入的id,即注入的對象「英語」,該對象爲Englis類生成-->
        <property name="language" ref="英語"></property>
    </bean>
    <!--注入English-->
    <bean id="英語" class="iocexample2.English"></bean>
</beans>

 iocexample2例子的運行結果:

  

 

  

  (3).BeanFactory接口及其相關類

  (4).ApplicationContext接口及其相關類

 

注:spring3的最後的兩個主要組件就先放到下篇再講。

 


 

spring系列目錄:

 

通俗化理解Spring3 IoC的原理和主要組件(知識二總結)

Spring3 IoC主要組件詳解(知識三總結)

相關文章
相關標籤/搜索