Spring(1)IOC/DI

前言

        在傳統的Java SE程序設計,當一個對象涉及到其他對象或者資源的引用時,我們通常會採取直接在對象內部通過new()方法去主動創建依賴的對象。通過這種方式也就會導致當前模塊與依賴對象的耦合,伴隨着應用的規模越來越龐大,對象之間的依賴關係也越來越複雜,經常會出現對象之間的多重依賴性關係,當系統中對象之間耦合度過高時,必將會出現牽一髮而動全身的問題,給系統的維護與升級帶來很大的風險,爲了解決對象之間的耦合度過高的問題,IOC理論也就應運而生。

IOC的理解

        IOC-Inversion of Control,即控制反轉,從字面意思上理解,我們需要弄明白3點,一、控制什麼?二、誰來控制?三、何爲反轉?控制,在這裏指的是對象的創建及對象之間的依賴,誰來控制,由傳統的由對象自己控制轉爲交給容器控制,這也是反轉的意思(正轉即對象自己控制)。由此可以看出,IOC不是一種什麼技術,主要是一種設計思想。所以,IOC可以定義爲:由IOC容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。

Spring中IOC的實現:

依賴注入的方式:
(1)設置器注入(Setterr Injection),就是通過JavaBean的set方法。
(2)構造器注入(Constructor Injection),就是通過類的構造器了,帶參數的構造器來設置依賴的類實例或屬性。
(3)方法注入(Method Injection),這種方式使用的最少,就是通過普通的方法注入了。

在Spring中,最基本的IOC容器接口是BeanFactory ,該接口爲具體的IOC容器的實現作了最基本的功能規定,其代碼如下:

    public interface BeanFactory {  
      
        //這裏是對FactoryBean的轉義定義,因爲如果使用bean的名字檢索FactoryBean得到的對象是工廠生成的對象,  
        //如果需要得到工廠本身,需要轉義         
        String FACTORY_BEAN_PREFIX = "&";  
      
      
        //這裏根據bean的名字,在IOC容器中得到bean實例,這個IOC容器就是一個大的抽象工廠。  
        Object getBean(String name) throws BeansException;  
      
        //這裏根據bean的名字和Class類型來得到bean實例,和上面的方法不同在於它會拋出異常:如果根據名字取得的bean實例的Class類型和需要的不同的話。  
        Object getBean(String name, Class requiredType) throws BeansException;  
      
        //這裏提供對bean的檢索,看看是否在IOC容器有這個名字的bean  
        boolean containsBean(String name);  
      
        //這裏根據bean名字得到bean實例,並同時判斷這個bean是不是單件  
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;  
      
        //這裏對得到bean實例的Class類型  
        Class getType(String name) throws NoSuchBeanDefinitionException;  
      
        //這裏得到bean的別名,如果根據別名檢索,那麼其原名也會被檢索出來  
        String[] getAliases(String name);  
      
    }  
在BeanFactory裏只對IOC容器的基本行爲作了定義,實際運用中Spring爲我們準備好了一系列工廠來讓我們使用,當然你也可以實現自己的IOC容器。

DI 的理解

        DI-Dependency Injection,即依賴注入,它跟IOC是同一個概念的不同角度描述,由於控制反轉概念比較含糊(可能只是理解爲容器控制對象這一個層面,很難讓人想到誰來維護對象關係),所以又提出了依賴注入概念,即組件之間依賴關係由容器在運行期決定。


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