shenang博客技术文档


理论不懂就实践,实践不会就学理论!

posts - 35,comments - 55,trackbacks - 0
 

SpingBeanWrapperBeanFactory ApplicationContext

 

org.springframework.beans包中包括了核心组件的实现类, 核心中的核心为BeanWrapperBeanFactory类。

我对这三个类的理解是:

1、 通过Spring BeanWrapper去操作一个JavaBean;

2、 Bean Factory负责根据配置文件创建Bean实例;

3、 BeanFactory提供了针对Java Bean的管理功能,而ApplicationContext提供了一更为框架化的实现(从上面的示例中可以看出,BeanFactory的使用方式更加类似一个API,而非Framework style ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性。此外,ApplicationContext为与现有应用框架相整合,提供了更为开放式的实现(如对于Web应用,我们可以在web.xml中对ApplicationContext进行配置。

一、看看如何通过Spring BeanWrapper操作一个JavaBean

 

Object obj = Class.forName("net.xiaxin.beans.User").newInstance();

BeanWrapper bw = new BeanWrapperImpl(obj);

bw.setPropertyValue("name", "Erica");

System.out.println("User name=>"+bw.getPropertyValue("name"));

对比之前的代码,相信大家已经知道BeanWrapper的实现原理。

诚然,通过这样的方式设定Java Bean属性实在繁琐,但它却提供了一个通用的属性设定机制,而这样的机制,也正是Spring依赖注入机制所依赖的基础。

通过BeanWrapper,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)

二、 Bean Factory

 Bean Factory,顾名思义,负责创建并维护Bean实例。

 Bean Factory负责根据配置文件创建Bean实例,可以配置的项目有:

1 Bean属性值及依赖关系(对其他Bean的引用)

2 Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)

3 Bean初始化和销毁方法

4 Bean的依赖关系

.Bean Factory的生命周期

下面是一个较为完整的Bean配置示例:

Bean的定义

<bean

    id="beanId"1

    name="beanName"2

    class="beanClass"3

    parent="parentBean"4

    abstract="true | false"5

    singleton="true | false"6

    lazy-init="true | false | default"7

    autowire="no | byName | byType | constructor | autodetect | default"8

    dependency-check = "none | objects | simple | all | default"9

    depends-on="dependsOnBean"10

    init-method="method"11

    destroy-method="method"12

    factory-method="method"13

 factory-bean="bean">14

<property name="message">

<value>HeLLo</value>             (15)

</property>

<property name="dataSource">

<ref local="dataSource"/>            (16)

</property>

</bean>

<bean    id="dataSource"                    

class="org.springframework.jndi.JndiObjectFactoryBean">

<property name="jndiName">

<value>java:comp/env/jdbc/sample</value>

</property>

</bean>

1)、id: Bean的唯一标识名。它必须是合法的XML ID,在整个XML文档中唯一。

2)、name: 用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。

3)、class: 用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性。

4)、parent: 子类Bean定义它所引用它的父类Bean。这时前面的class属性失效。子类Bean会继承父类Bean的所有属性,子类Bean也可以覆盖父类Bean的属性。注意:子类Bean和父类Bean是同一个Java类。

5)、abstract(默认为”false”):用来定义Bean是否为抽象Bean。它表示这个Bean将不会被实例化,一般用于父类Bean,因为父类Bean主要是供子类Bean继承使用。

6)、singleton(默认为“true”):定义Bean是否是Singleton(单例)。如果设为“true,则在BeanFactory作用范围内,只维护此Bean的一个实例。如果设为“flase”,Bean将是Prototype(原型)状态,BeanFactory将为每次Bean请求创建一个新的Bean实例。

7)、lazy-init(默认为“default”):用来定义这个Bean是否实现懒初始化。如果为“true”,它将在BeanFactory启动时初始化所有的Singleton Bean。反之,如果为“false,它只在Bean请求时才开始创建Singleton Bean

8)、autowire(自动装配,默认为“default”):它定义了Bean的自动装载方式。

    1、“no:不使用自动装配功能。

    2、“byName:通过Bean的属性名实现自动装配。

    3、“byType:通过Bean的类型实现自动装配。

    4、“constructor:类似于byType,但它是用于构造函数的参数的自动组装。

    5、“autodetect:通过Bean类的反省机制(introspection)决定是使用“constructor”还是使用“byType”。

9)、dependency-check(依赖检查,默认为“default”):它用来确保Bean组件通过JavaBean描述的所以依赖关系都得到满足。在与自动装配功能一起使用时,它特别有用。

1、none:不进行依赖检查。

2、objects:只做对象间依赖的检查。

3、simple:只做原始类型和String类型依赖的检查

4、all:对所有类型的依赖进行检查。它包括了前面的objectssimple

10)、depends-on(依赖对象):这个Bean在初始化时依赖的对象,这个对象会在这个Bean初始化之前创建。

11)、init-method:用来定义Bean的初始化方法,它会在Bean组装之后调用。它必须是一个无参数的方法。

12)、destroy-method:用来定义Bean的销毁方法,它在BeanFactory关闭时调用。同样,它也必须是一个无参数的方法。它只能应用于singleton Bean

13)、factory-method:定义创建该Bean对象的工厂方法。它用于下面的“factory-bean”,表示这个Bean是通过工厂方法创建。此时,“class”属性失效。

14)、factory-bean:定义创建该Bean对象的工厂类。如果使用了“factory-bean”则“class”属性失效。

(15) <value>

通过<value/>节点可指定属性值。BeanFactory将自动根据Java Bean对应的属性

类型加以匹配。

下面的”desc”属性提供了一个null值的设定示例。注意<value></value>代表一

个空字符串,如果需要将属性值设定为null,必须使用<null/>节点。

(16) <ref>

指定了属性对BeanFactory中其他Bean的引用关系。示例中,TheActiondataSource

性引用了iddataSourceBeanBeanFactory将在运行期创建dataSource bean实例,并将其

引用传入TheAction BeandataSource属性。

例:

<beans>

     <description>Spring Bean Configuration Sample</description>

 

 <bean 

id="TheAction"                    

 class="net.xiaxin.spring.qs.UpperAction"     

 singleton="true"                 

init-method="init"                   

destroy-method="cleanup"             

depends-on="ActionManager"            

>

 

   <property name="message">

<value>HeLLo</value>             

</property>

 

<property name="desc">

<null/>

</property> 

 

<property name="dataSource">

<ref local="dataSource"/>            

</property>

 </bean>

 

<bean    id="dataSource"                    

class="org.springframework.jndi.JndiObjectFactoryBean">

 

<property name="jndiName">

<value>java:comp/env/jdbc/sample</value>

</property>

</bean>

.关于ApplicationContext

ApplicationContext

 BeanFactory提供了针对Java Bean的管理功能,而ApplicationContext提供了一个更为框架化的

实现(从上面的示例中可以看出,BeanFactory的使用方式更加类似一个API,而非Framework style 

ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性。此外,

ApplicationContext为与现有应用框架相整合,提供了更为开放式的实现(如对于Web应用,我们可以在

web.xml中对ApplicationContext进行配置)

相对BeanFactory而言,ApplicationContext提供了以下扩展功能:

 1国际化支持

我们可以在Beans.xml文件中,对程序中的语言信息(如提示信息)进行定义,将程序中的提示

信息抽取到配置文件中加以定义,为我们进行应用的各语言版本转换提供了极大的灵活性。

2资源访问

支持对文件和URL的访问。

3事件传播

事件传播特性为系统中状态改变时的检测提供了良好支持。

4多实例加载

可以在同一个应用中加载多个Context实例。

 

 

posted on 2009-03-23 11:30 重庆理工小子 阅读(1619) 评论(0)  编辑  收藏 所属分类: Spring2

只有注册用户登录后才能发表评论。


网站导航: