2014-05-03 16 views
1

我有一個註冊爲singleton的bean,並在其上定義了init-method和destroy-method。我正在訪問這個bean,並且可以看到正在對這兩個方法進行的調用。但是,將範圍更改爲原型時,不會調用destroy-method。在註冊爲原型的bean上不調用destroy-method

我不明白這背後的理由。

+0

有一個非常好的例子,這些方法如何在這裏工作:http://www.mkyong.com/spring/spring-init-method-and-destroy-method-example/ –

回答

2

閱讀the documentation

相較於其它範圍,Spring不會對一個prototype bean的整個生命週期:容器初始化,配置,或者是裝配一個原型對象,並把它給客戶端,沒有進一步記錄該原型實例。因此,儘管在所有對象上調用初始化生命週期回調方法而不管範圍,但在原型的情況下,不調用配置的銷燬生命週期回調。

而且這很合情理:您的應用程序可以每10毫秒要求一次原型bean的新實例,對bean執行一些操作,然後讓它超出範圍。如果Spring在應用程序關閉時不得不銷燬它們,它必須保留對每個創建的原型bean的引用,從而防止它們被垃圾收集,從而導致內存泄漏。

+0

謝謝你。解釋有幫助。 – user2171262