天天看點

Spring3之 IoC容器的執行個體化

Bean:在Spring中,那些組成你應用程式的主體(backbone)及由Spring IOC容器所管理的對象,被稱之為bean。 簡單地講,bean就是由Spring容器初始化、裝配及管理的對象,除此之外,bean就與應用程式中的其他對象沒有什麼差別了。 而bean定義以及bean互相間的依賴關系将通過配置中繼資料來描述。

org.springframework.beans.factory.BeanFactory是Spring IoC容器的實際代表者,IoC容器負責容納此前所描述的bean,并對bean進行管理,包括:執行個體化、定位、配置應用程式中的對象及建立這些對象間的依賴。

Spring IoC容器可以通過多種途徑來加載配置中繼資料,比如本地檔案 系統、Java CLASSPATH等(貌似URL也行)。

Spring3之 IoC容器的執行個體化

Spring IoC容器的執行個體化非常簡單,可以用ClassPathXmlApplicationContext or FileSystemXmlApplicationContext類來完成,AnnotationConfigApplicationContext也可以用注解來完成。

a).XML式

包名:com.spring305.test.iocInstance

檔案清單:BeanA.java,BeanB.java,IocInstance.java,IocInstanceA.xml,在此包下有一包temp,另有一份測試配置檔案IocInstance.xml

代碼如下:

BeanA.java

BeanB.java

public class BeanA {

	private int id;
	private String name;

	public BeanA() {
	}
	
	public BeanA(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
	public void testMethod(){
		System.out.println(BeanA.class);
	}

                  setter,getter
}           
public class BeanB {

	private int id;
	private String name;

	public BeanB() {
	}
	
	public BeanB(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
	public void testMethod(){
		System.out.println(BeanB.class);
	}
	
          ...getter,setter

}           

IocInstanceA.xml

<!-- 下面是引用XML的路徑及寫法注釋,使用時隻保留一個,并且對應相應路徑 -->
	<!-- 這二種表示這個引入的檔案要與本XML檔案在同一級目錄中
		<import resource="IocInstance.xml"/>
		<import resource="/IocInstance.xml"/>
		下面二種表示在目前XML目錄中temp檔案夾下面
		 <import resource="temp/IocInstance.xml"/>
		 <import resource="/temp/IocInstance.xml"/>
	 -->
	 <!-- 這下面的一個是相對路徑的書寫方式,引入根目錄下的XML檔案,
	 	<import resource="../../../../IocInstance.xml"/>
	 -->
	 
	 <!--
	 	classpath:這種方式可以使用但是,在spring3的英文文檔中并不推薦使用,推薦使用用../到父目錄中或者/到下級目錄來找,因為classpath:可能在部署的時候引向不正确的目錄
		<import resource="classpath:IocInstance.xml"/>	 
	  -->
	  <!-- 下面的這種方式也是可以的,但是,也不被推薦,原因同上,如果采用這二種情況,spring3建議把路徑寫上,然後用${}來引入 -->
	<import resource="file:D:/workspace/MyEclipseSSH/Spring305/src/IocInstance.xml"/>
	 
	<bean id="beanA" class="com.spring305.test.iocInstance.BeanA"></bean>      

src目錄下IocInstance.xml ,主要是用來測試從一個XML檔案引入另外一個檔案來執行個體化的,它和temp包下的IocInstance.xml的内容一樣也隻有beanB這個bean,後者主要是用來測試路徑的。

IocInstance.xml

<bean id="beanB" class="com.spring305.test.iocInstance.BeanB"></bean>      

測試類:

IocInstance.java

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class IocInstance {

	@Test//annotation執行個體化容器
	public void TestIocInstanceAnnotation(){
		ApplicationContext atx = new AnnotationConfigApplicationContext(BeanAAnnotaion.class);
		//下面的Bean名是類的名字,首字母小寫
		//BeanAAnnotaion a = (BeanAAnnotaion)atx.getBean("beanAAnnotaion");
		//下面是自己在類中用@bean定義的bean
		//BeanAAnnotaion a = (BeanAAnnotaion)atx.getBean("getBeanAAnnotation");
		//System.out.println(a.getMsg());
		
		//下面的是定義的一個傳回類型為String類型的bean
		String getMsg = atx.getBean("getMsg",String.class);
		System.out.println(getMsg);
		
		
	}
	
	//@Test//XML執行個體化容器
	public void TestIocInstanceXML(){
		//加載1到N個XML檔案 ,檔案前加與不加'/',代表的都是src目錄下的檔案
		//ApplicationContext atx = new ClassPathXmlApplicationContext("IocInstance.xml");
		//ApplicationContext atx = new ClassPathXmlApplicationContext(new String[]{"IocInstance.xml"});
		//ApplicationContext atx = new ClassPathXmlApplicationContext(new String[]{"IocInstance.xml","IocInstance2.xml"});
		//ApplicationContext atx = new ClassPathXmlApplicationContext(new String[]{"/IocInstance.xml"});
		
		//BeanB a = (BeanB)atx.getBean("beanB");
		//a.testMethod();
		
		//XML配置在com...包下,則可以如下書寫
		//ApplicationContext atx = new ClassPathXmlApplicationContext(new String[]{"/com/spring305/test/iocInstance/IocInstanceA.xml"});
		//ApplicationContext atx = new ClassPathXmlApplicationContext(new String[]{"com/spring305/test/iocInstance/IocInstanceA.xml"});
		//下面也可以用FileSystemXmlApplicationContext來加載XML檔案,這裡要寫檔案的絕對位置
		ApplicationContext atx = new FileSystemXmlApplicationContext(new String[]{"file:D:/workspace/MyEclipseSSH/Spring305/src/com/spring305/test/iocInstance/IocInstanceA.xml"});
		
		//ApplicationContext接口實作了BeanFactory接口
		BeanFactory factory = atx;
		
		//BeanA a = (BeanA)atx.getBean("beanA");
		//下面的一種得到bean的方式,不用進行和以前一樣寫強制轉換
		BeanA a = atx.getBean("beanA",BeanA.class);
		a.testMethod();

	}
	
}           

b).Annotaion式

BeanAAnnotaion.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BeanAAnnotaion {

	@Bean
	public BeanAAnnotaion getBeanAAnnotation(){
		return new BeanAAnnotaion();
	}
	
	@Bean 
	public String getMsg(){
		return BeanAAnnotaion.class.toString();
	}
	
}