Spring中IoC的基本概念(一)
什麼是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行為。