在spring中有三种管理Bean的方式,分别为BeanWrapper管理Bean,BeanFactory管理Bean,ApplicationContext管理Bean。
一,BeanWrapper管理Bean
在org.springframework.beans包中,有两个很重要的类:BeanWrapper接口和它的实现类BeanWrapperImpl。
BeanWrapper封装了对bean的设置和获取属性值,看看实例:
HelloWorld类:
package com.lanhuigu.spring.action; public class HelloWorld{ private String msg; private RefTest refTest; //有参构造器 /*public HelloWorld(RefTest refTest){ this.refTest = refTest; }*/ //通过set方法注入属性值 public void setMsg(String msg) { this.msg = msg; } public String getMsg() { return msg; } public RefTest getRefTest() { return refTest; } public void setRefTest(RefTest refTest) { this.refTest = refTest; } }
spring配置:
<?xml version="1.0" encoding="UTF-8"?> <!-- - Application context definition for JPetStore's business layer. - Contains bean references to the transaction manager and to the DAOs in - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation"). --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- 定义一个id为sayHello的bean, 通过spring配置文件变换实现类,实现不同的功能,无需修改别的程序 --> <bean id="sayHello" class="com.lanhuigu.spring.action.HelloWorld" > <!-- 将变量msg值依赖注入 --> <property name="msg"> <value>测试</value> </property> <!-- refTest为HelloWorld的一个属性,通过ref指定依赖关系, 也就是说你依赖于哪个类,或者接口,直接把这个类通过set方式注入 , 看看HelloWorld的属性定义就明白了--> <property name="refTest"> <ref bean="refTest"/> </property> </bean> <!-- RefTest类 --> <bean id="refTest" class="com.lanhuigu.spring.action.RefTest"> <!-- myRef为RefTest类的一个属性 --> <property name="myRef"> <value>依赖关系测试</value> </property> </bean> </beans>
测试程序,我把三种测试程序都写在一起,可以单独运行当前管理方式的测试程序:
package com.lanhuigu.spring.test; import org.junit.Test; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.core.io.ClassPathResource; import com.lanhuigu.spring.action.HelloWorld; public class TestHelloWorld { @Test public void testMyHelloWorld(){ //==================1.BeanWrapper管理Bean================ //1.1 通过Class.forName()获取HelloWorld实例 Object obj = null; try { obj = Class.forName("com.lanhuigu.spring.action.HelloWorld").newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } //1.2 通过BeanWrapper设置HelloWorld的属性值 BeanWrapper bw = new BeanWrapperImpl(obj); bw.setPropertyValue("msg", "HelloWorld"); //1.3 把刚设定的属性值通过属性名输出 System.out.println(bw.getPropertyValue("msg")); //==================2.BeanFactory管理Bean================ //2.1 通过ClassPathResource获取spring配置文件 ClassPathResource res = new ClassPathResource("/applicationContext.xml"); //2.2 通过XmlBeanFactory解析配置文件 BeanFactory factory = new XmlBeanFactory(res); //2.3 根据id获取从factory中Bean HelloWorld helloBF = (HelloWorld)factory.getBean("sayHello"); //2.4 输出HelloWorld的属性值 System.out.println(helloBF.getMsg()); //==================3.ApplicationContext管理Bean========= //3.1 读取spring初始化的配置文件 ApplicationContext acxt = new ClassPathXmlApplicationContext("/applicationContext.xml"); //3.2 根据bean获取ISayHello实现类对象 HelloWorld helloAC = (HelloWorld) acxt.getBean("sayHello"); //3.3 调用接口方法 System.out.println(helloAC.getMsg()); //3.4 先获取依赖的类RefTest,在从依赖类中获取依赖类的属性 System.out.println(helloAC.getRefTest().getMyRef()); } }
二,BeanFactory管理Bean
BeanFactory实际上是实例化,配置和管理多个Bean的容器。这些Bean可能彼此合作,相互依赖。
一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示,这个接口有多个实现类。
最简单的实现类org.springframework.beans.factory.xml.XmlBeanFactory,从上面的测试程序中可以看到演示。
三,ApplicationContext管理Bean
ApplicationContext建立在BeanFactory的基础之上,并增加了其他功能,事件传递等等。
BeanFactory提供配置框架和基本功能,而ApplicationContext增加了更加强大的功能。
一般说法,ApplicationContext是BeanFactory的超集,包含了BeanFactory的所有功能,
也就是说任何BeanFactory的功能同样适用于ApplicationContext。
演示实例看上面的测试程序。
=======================================================================
关于这三种管理Bean方式的总结:
在以上三种管理Bean的方式实现的都是同样的功能,对Bean的配置和属性设置。从上的实例中,
可以清楚的认识到第一种管理方式BeanWrapper管理Bean的方式并没有用到spring配置文件,而且
只能对单个Bean进行配置和设置,一般不用。
一般用BeanFactory和ApplicationContext,而ApplicationContext是BeanFactory的超集,
所以重点中的重点是研究明白ApplicationContext是怎么对Bean进行管理,比BeanFactory
多使用了哪些额外的功能的。