2010-10-26 56 views
1

我正在开发一个项目,它意味着定制在Spring 2.5.6(以及其他Spring框架主机)中实现的现有应用程序(JasperServer 3.7.1)。Spring Instantiation和'unused beans'

该应用程序由一系列包含bean定义的applicationContext * .xml组成,这些定义在Spring中连接在一起时将应用程序带入生活 - 我认为这是典型的Spring应用程序配置,尽管它是我第一次使用Spring的经验,所有这些都很好地结合在一起,并遵循了我在网络和书籍上看到的很多示例。

因为我实际上正在修改现有应用程序,因此改变了像filterChainProxy这样的bean(因为我们有自己的安全模型,例如)我对更改产品附带的实际配置文件保持警惕 - 相反,如果可能的话,我更愿意将额外的appContext配置文件添加到覆盖现有bean的现有配置文件中(即将原始配置保持原样,多达p ossible)。

这是我设法通过创建实现BeanFactoryPostProcessor的Bean来实现的,它在bean初始化初始化时允许我将现有属性值/ bean引用改为自定义属性值。这一切似乎工作正常。

我的查询是说,我有一个bean的属性引用另一个bean,而我的覆盖bean改变了对我自己版本的bean的引用,Spring是否仍然实例化不再引用的bean?明显要求的原因是,其中一些未使用的bean可能占用了资源,这可能是不必要的开销。

在此先感谢

回答

1

我不知道我跟着你的榜样,但它可能有助于澄清一些事情。通常情况下,Spring会为上下文中的每个非抽象bean定义实例化一个bean(这是忽略非单例bean范围之类的东西,但为了解释的目的,我将忽略它)。如果使用多个bean定义文件,并且某些bean名称被复制,则其他定义将被其他定义覆盖。到目前为止,这么好,这似乎是你想要的。

一旦建立了bean定义,并且处理了任何重复的内容,Spring就会为每个定义实例化一个bean。如果您已更改BeanA的定义,使其不再指BeanB,而是指BeanC,但BeanB的定义仍存在,则即使未使用BeanB,它仍将被实例化。

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

+0

这确实回答了这个问题,谢谢。 所以我的问题是,我有豆(如你的例子中的BeanB)躺在什么都不做,但可能会占用资源。无论如何,我可以告诉BeanFactory/ApplicationContext删除这些? – Neil 2010-10-26 12:35:52

+0

@尼尔:只有用无害的东西来重写它的定义。 – skaffman 2010-10-26 12:51:41