1. 程式人生 > >spring ioc

spring ioc

eric 中國 factor nbsp 而是 錯誤 ack odi 測試的

軟件152 程永績

1.什麽是IOC:

IocInversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。如何理解好Ioc呢?理解好Ioc的關鍵是要明確“誰控制誰,控制什麽,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了”,那我們來深入分析一下:

  ●誰控制誰,控制什麽:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象,即由Ioc容器來控制對 象的創建;誰控制誰?當然是IoC

容器控制了對象;控制什麽?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。

●為何是反轉,哪些方面反轉了:有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及註入依賴對象;為何是反轉?因為由容器幫我們查找及註入依賴對象,對象只是被動的接受依賴對象,所以是反轉;哪些方面反轉了?依賴對象的獲取被反轉了。

2.IOC實例:

數據模型

1、如下圖所示有三個類,Human(人類)是接口,Chinese(中國人)是一個子類,American(美國人)是另外一個子類。 如圖:

技術分享

代碼如下:

package

cqvie.com;

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

Human {

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、采用SpringIoC的用法如下:

在項目根目錄下創建一個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