spring(10)------Bean三种管理方式

在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

多使用了哪些额外的功能的。



你可能感兴趣的:(beanfactory,BeanWrapper,XmlBeanFactory,三种管理Bean方式)