spring ioc
軟件152 程永績
1.什麽是IOC:
Ioc—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麽,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下:
●誰控制誰,控制什麽:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象,即由Ioc容器來控制對 象的創建;誰控制誰?當然是IoC
●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及註入依賴對象;為何是反轉?因為由容器幫我們查找及註入依賴對象,對象只是被動的接受依賴對象,所以是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。
2.IOC實例:
數據模型
1、如下圖所示有三個類,Human(人類)是接口,Chinese(中國人)是一個子類,American(美國人)是另外一個子類。 如圖:
代碼如下:
package
public interface Human {
void eat();
void walk();
}
package cqvie.com;
public class Chinese implements Human {
public void eat() {
System.out.println("中國人對吃很有一套");
}
public void walk() {
System.out.println("中國人行如飛");
}
}
package cqvie.com;
public class American implements
public void eat() {
System.out.println("美國人主要以面包為主");
}
public void walk() {
System.out.println("美國人以車代步,有四肢退化的趨勢");
}
}
2、對以上對象采用工廠模式的用法如下:
創建一個工廠類Factory,如下。這個工廠類裏定義了兩個字符串常量,所標識不同的人種。getHuman方法根據傳入參數的字串,來判斷要生成什麽樣的人種。
package cqvie.com;
public class Factory {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public Human getHuman(String ethnic) {
if (ethnic.equals(CHINESE))
return (Human) new Chinese();
else if (ethnic.equals(AMERICAN))
return new American();
else
throw new IllegalArgumentException("參數(人種)錯誤");
}
}
下面是一個測試的程序,使用工廠方法來得到了不同的“人種對象”,並執行相應的方法。
public class ClientTest {
public static void main(String[] args) {
Human human = null;
human = new Factory().getHuman(Factory.CHINESE);
human.eat();
human.walk();
human = new Factory().getHuman(Factory.AMERICAN);
human.eat();
human.walk();
}
}
打印結果如下
3、采用Spring的IoC的用法如下:
在項目根目錄下創建一個bean.xml文件,代碼如下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="Chinese" class="cn.com.cqvie.spring.Chinese"/>
<bean id="American" class="cn.com.cqvie.spring.American"/>
</beans>
修改ClientTest程序如下:
package cqvie.com;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class ClientTest {
public final static String CHINESE = "Chinese";
public final static String AMERICAN = "American";
public static void main(String[] args) {
// Human human = null;
// human = new Factory().getHuman(Factory.CHINESE);
// human.eat();
// human.walk();
// human = new Factory().getHuman(Factory.AMERICAN);
// human.eat();
// human.walk();
ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
Human human = null;
human = (Human) ctx.getBean(CHINESE);
human.eat();
human.walk();
human = (Human) ctx.getBean(AMERICAN);
human.eat();
human.walk();
}
}
從這個程序可以看到,ctx就相當於原來的Factory工廠,原來的Factory就可以刪除掉了。然後又把Factory裏的兩個常量移到了ClientTest類裏,整個程序結構基本一樣。
再回頭看原來的bean.xml文件的這一句:
<bean id="Chinese" class="cn.com.cqvie.spring.Chinese"/>
id就是ctx.getBean的參數值,一個字符串。class就是一個類(包名+類名)。然後在ClientTest類裏獲得Chinese對象就是這麽一句:
human = (Human) ctx.getBean(CHINESE);
因為getBean方法返回的是Object類型,所以前面要加一個類型轉換。
spring ioc