读书人

spring 的Beans, BeanFactory跟Applic

发布时间: 2012-12-22 12:05:06 作者: rapoo

spring 的Beans, BeanFactory和ApplicationContext

?

注意:当部署一个bean为prototype模式,这个bean的生命周期就会有稍许改变。 通过定义,Spring无法管理一个non-singleton/prototype bean的整个生命周期, 因为当它创建之后,它被交给客户端而且容器根本不再跟踪它了。当说起non-singleton/prototype bean的时候, 你可以把Spring的角色想象成“new”操作符的替代品。从那之后的任何生命周期方面的事情都由客户端来处理 。BeanFactory中bean的生命周期将会在?第?3.4.1?节 “生命周期接口”一节中有更详细的叙述。

同下面的完全一样:

同下面的完全一样:

如果子bean定义没有指定class属性,将使用父定义的class属性,当然也可以覆盖它。 在后面一种情况中,子bean的class属性值必须同父bean的兼容,也就是它必须能够接受父亲的属性值。

一个子bean定义可以从父亲处继承构造函数参数,属性值以及方法,并且可以选择增加新的值。 如果init-method,destroy-method和/或静态factory-method被指定了,它们就会覆盖父亲相应的设置。

剩余的设置将?

这个父bean就无法自己实例化;它实际上仅仅是一个纯模版或抽象bean,充当子定义的父定义。 若要尝试单独使用这样的父bean(比如将它作为其他bean的ref属性而引用,或者直接使用这个父 bean的id调用getBean()方法),将会导致一个错误。同样地,容器内部的

真正的值来自于另一个Properties格式的文件:

3.16.?粘合代码和罪恶的singleton

一个应用中的大多数代码最好写成依赖注射(反向控制)的风格,这样这些代码就和BeanFactory容器或者ApplicationContext容器无关,它们在被创建的时候从容器处得到自己的依赖,并且完全不知道容器的存在。然而,对于少量需要与其它代码粘合的粘合层代码来说,有时候就需要以一种singleton(或者类似singleton)的方式来访问BeanFactory或ApplicationContext。举例来说,第三方的代码可能想要(以Class.forName()的方式)直接构造一个新的对象,却没办法从BeanFactory中得到这些对象。如果第三方代码构造的对象只是一个小的stub或proxy,并且使用singleton方式访问BeanFactroy/ApplicationContext来获得真正的对象,大多数的代码(由BeanFactory产生的对象)仍然可以使用反向控制。因此大多数的代码依然不需要知道容器的存在,或者容器是如何被访问的,并保持和其它代码解耦,有着所有该有的益处。EJB也可以使用这种stub/proxy方案代理到一个普通的BeanFactory产生的java实现的对象。虽然理想情况下BeanFactory不需要是一个singleton,但是如果每个bean使用它自己的non-singleton的BeanFactory,对于内存使用或初始化次数都是不切实际。

另一个例子,在一个多层的复杂的J2EE应用中(比如有很多JAR,EJB,以及WAR打包成一个EAR),每一层都有自己的ApplicationContext定义(有效地组成一个层次结构),如果顶层只有一个web-app(WAR)的话,比较好的做法是创建一个由不同层的XML定义文件组成的组合ApplicationContext。所有的ApplicationContext变体都可以从多个定义文件以这种方式构造出来。但是,如果在顶层有多个兄弟web-apps,为每一个web-app创建一个ApplicationContext,但是每个ApplicationContext都包含大部分相同的底层的bean定义,这就会因为内存使用而产生问题,因为创建bean的多个copy会花很长时间初始化(比如Hibernate SessionFactory),以及其它可能产生的副作用。作为替换,诸如ContextSingletonBeanFactoryLocatorSingletonBeanFactoryLocator的类可以在需要的时候以有效的singleton方式,加载多个层次的(比如一个是另一个的父亲)BeanFactory或ApplicationContext,这些将会作为web-app ApplicationContext的parents。这样做的结果就是,底层的bean定义只在需要的时候加载并且只被加载一次。

3.16.1.?使用SingletonBeanFactoryLocator和ContextSingletonBeanFactoryLocator

你可以查看SingletonBeanFactoryLocatorContextSingletonBeanFactoryLocator的JavaDoc来获得详细的使用例子。

正如在EJB那一章提到的,Spring为EJB提供的方便的基类一般使用一个non-singleton的BeanFactoryLocator实现,这个可以在需要的时候被SingletonBeanFactoryLocatorContextSingletonBeanFactoryLocator替换。


[1]?See?第?3.3.1?节 “设置bean的属性和合作者”


?

读书人网 >编程

热点推荐