1. 程式人生 > >Spring中IoC的基本概念(一)

Spring中IoC的基本概念(一)

  1. 什麼是IoC

    在實際應用的開發當中,需要儘量避免和降低物件之間的依賴關係,即降低耦合度。而Ioc就是解決了一般業務物件之間、業務物件與持久層之間存在的各種依賴關係。
    在沒有Ioc的實現中,物件都是由程式的內部程式碼來控制的。當一個物件需要依賴另一個物件時,用new來建立它的依賴物件去實現兩個元件之間的聯絡,而這種s實現方式會造成元件之間的耦合。
    控制反轉(Inverion of Control,IoC)是指在應用程式中物件的建立、銷燬等不再由程式本身的編碼實現,而是由外部的Spring容器在程式執行時根據需要注入到程式中,也就是物件的生命週期不是由程式本身來決定,而是由容器來控制,所以稱之為控制反轉。這種控制權轉移所帶來的好處就是降低物件之間的依賴關係,即解耦。
    2、下面程式碼實現IoC
    不同的動物各自喜愛的食物不一樣,狗吃bone貓吃魚fish
    (1)建立EatAble
    EatAble介面中定義一個eat方法,實現該介面的物件將提供具體的方法實現。EatAble.java
    public interface EatAble{
    void eat();
    }
    (2)建立一個Animal類實現EatAble介面,提供eat方法實現

public class Animal {
private String animalType;
private String eatMode;

public void setAnimalType(String animalType) {
    this.animalType = animalType;
}

public void setEatMode(String eatMode) {
    this.eatMode = eatMode;
}
@Override
public void eat(){
String msg = animalType + " eat " + eatMode;
System.out
.println(msg); } }

(3)新增Spring的配置資訊
建立Spring的配置檔案bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xmlns:tx="http://www.springframework.org/schema/tx"          xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="animal" class="ioc.Animal"> <property name="animalType"> <value>Dog</value> </property> <property name="eatMode"> <value>bone</value> </property> </bean> </beans>

該配置檔案的作用是將ioc.Animal類例項化為物件,該物件可以通過id的值animal來獲取,設定animalType的屬性為Dog,設定其eatMode的屬性值為bone。
(4)建立測試類Test
Test.java

public class Test {
public static void main(String[] args) {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
    EatAble animal = (EatAble)ctx.getBean("animal");
    animal.eat();
}
}

這段程式碼的作用:首先載入Spring容器,然後通過鍵值animal來獲取Animal的JavaBean物件,並將屬性賦值;
程式執行的結果是

Dog eat bone

然後再把配置檔案改為

<property name="animalType">
<value>Cat</value>
</property>
<property name="eatMode">
<value>fish</value>
</property>

程式執行結果為Cat eat fish
3、通過上面的例子可以看到
(1)除了測試程式碼之外,所有的程式程式碼中,並沒有依賴Spring中的任何元件。
(2)Animal的animalType和eatAble屬性都是由Spring通過讀取配置檔案動態設定。由於屬性是程式執行期間需要時才注入,減少了Animal類對這些屬性的依賴,降低了耦合性。
因為Animal累屬性的值不少硬編碼產生,是由Spring容器注入,不依賴自身和=而依賴外部容器,所以稱之為控制反轉(IoC);
(3)在不改變Animal類的任何程式碼情況下,可以通過簡單的修改配置檔案來實現不同型別Animal的eat行為。