netgame 2011-04-16
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(); } }
是一道经常出现在前端面试时的问题。如果只是简单的了解new关键字是实例化构造函数获取对象,是万万不能够的。更深入的层级发生了什么呢?同时面试官想从这道题里面考察什么呢?下面胡哥为各位小伙伴一一来解密。