Spring控制反轉(IoC)的理解

Spring框架的核心就是控制反轉(Inversion of Control)和依賴注入(Dependency Injection),通過這兩方面來實現鬆耦合。

    使用IoC,對象是被動的接受依賴類,而不是自己主動的去找。容器在實例化的時候主動將它的依賴類注入給它。可以這樣理解:控制反轉將類的主動權轉移到接口上,依賴注入通過xml配置文件在類實例化時將其依賴類注入。通過下面的實例來逐步的理解:


    首先假設有一個需求,類Business需要調用類Dependency的方法f(),按照日常的做法,得到下面的代碼:
//**類Dependency**
public class Dependency {
    public void f() {};
}
//**類Business**
public  class Business {
    Dependency d;
    public Business() {
    d = new Dependency();
    }
    public void doSth() {
        d.f();
    }
}


    對上述實現做出如下修改:
    首先,將Business裏的Dependency實例的獲得該爲setter方式,其次,將Dependency類改爲某個接口的實現。故可以得到下面新的代碼:
//**接口IDependency**
public interface IDependency {
    void f();
}
//**類Dependency**
public class Dependency {
    public void f() {};
}
//**類Business**
public  class Business {
    IDependency d;
    public Business() {}
    public void doSth() {
     d.f();
    }
    public void setDependency(IDependency d) {
        this.d = d;
    }
}


    在新的代碼中,首先Business的變量d可以接收任何IDependency的實例,另外,Dependency的實例不是通過Business來獲 得,而是通過setter(也可以用構造器)來由外部傳給它。這似乎跟我們往常的代碼沒什麼不同,但這已經是一個良好的設計。關鍵就是 Dependency的實例如何從外部注入給Business呢?
這就要通過xml來實現了。

    創建一個SpringFirst.xml,進行簡單的配置:
<beans>
    <bean id = "dependency" class = "aopfirst.business.Dependency" />
    <bean
        id = "business"
        class = "aopfirst.business.Business"
    >
        <property name = "dependency">
            <ref bean = "dependency" />
        </property>
    </bean>
</beans>
    這個配置文件裏將Dependency類和Business類加入,並將Dependency作爲Business的一個參數。


    單有了這個xml文件還不夠,還需要一個測試類來加載該xml文件,spring提供了現成的API,在加載上面的xml的時候,就進行了如下工作:實例 化Dependency類,實例化Business類,並將Dependency的實例作爲參數賦給了Business實例的
setDependency()方法。下面是該測試程序:


public class StartServer {
    public static void main(String [] args) {
     ClassPathResource cr = new ClassPathResource("SpringFirst.xml");
     BeanFactory factory = new XmlBeanFactory(cr);
     Business b = (Business)factory.getBean("business");
     b.doSth();
    }
}


    上面的程序加載了xml以後,獲得id爲"business"的bean,即Business類的實例,並調用了其doSth() 方法。由此可見,Business的依賴類Dependency是通過xml來注入的,而且Business是通過接口IDependency來接收 Dependency實例。因此,當我們又有新的IDependency的實現時,只需要修改xml文件即可,測試程序只需要根據xml裏的id值來獲得 需要的參數。

    總結上面的例子,對控制反轉和依賴注入已經能理解了。依賴類(Dependency)是通過外部(xml)來注入的,而不是由使用它的類 (Business)來自己製造,這就是依賴的注入。另一方面,Business對類Dependency的依賴轉移到對接口IDependency的依 賴,控制權由類轉移到了接口,即由"實現"轉移到"抽象"中。這就是控制反轉。

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