天天看点

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