2010-10-26 60 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