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 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 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
}
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>
<!-- 下面是引用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();
}
}
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();
}
}