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();
}
}