Spring Instantiation和'unused beans'

时间:2010-10-26 12:07:55

标签: spring

我正在开发一个项目,这意味着自定义一个在Spring 2.5.6中实现的现有应用程序(JasperServer 3.7.1)(以及许多其他Spring框架)。

该应用程序由一系列applicationContext * .xml组成,其中包含bean定义,当Spring连接在一起时,应用程序生动 - 我认为这是一个典型的Spring应用程序配置,虽然它是我第一次使用Spring的体验,但似乎所有很好地整理并遵循我在网上和书中看到的很多例子..

因为我实际上正在修改现有的应用程序,所以更改了像filterChainProxy之类的bean(例如,因为我们有自己的安全模型),我担心更改产品附带的实际配置文件 - 而是在可能的情况下,我更喜欢将额外的appContext配置文件添加到覆盖现有bean的现有配置文件中(即尽可能保留原始配置)。

我已经设法通过创建实现BeanFactoryPostProcessor的bean来实现,在bean初始化之前允许我将现有的属性值/ bean引用更改为自定义的bean。这一切似乎都很好。

我的查询是,假设我有一个带有引用另一个bean的属性的bean,并且我的overrider bean更改了对我自己的bean版本的引用,Spring是否仍会实例化不再引用的bean?显而易见的原因是这些未使用的bean中的一些可能占用资源,这可能是不必要的开销。

提前致谢

1 个答案:

答案 0 :(得分:2)

我不确定我是否按照你的例子,但它可能有助于澄清一些事情。

通常,Spring会为上下文中的每个非抽象bean定义实例化一个bean(这忽略了非单例bean作用域之类的东西,但为了解释的目的,我会忽略它)。如果使用多个bean定义文件,并且某些bean名称重复,则其他定义将被其他定义覆盖。到目前为止,这么好,这似乎是你想要的。

一旦建立了bean定义,并处理了任何重复的定义,Spring就会为每个定义实例化一个bean。如果您更改了BeanA的定义,使其不再引用BeanB,而是引用BeanC,但BeanB的定义仍然存在,那么{{ 1}}仍将被实例化,即使它没有被使用。

如果该示例不能代表您的问题,请详细说明。