2016-04-23 87 views
3

在現實世界的應用程序中,可能使用銷燬方法的一個可能示例?爲什麼一個正在運行的應用程序想要銷燬它的bean?如果bean是通過ContextLoaderListener爲Web應用程序的spring容器創建的,那麼這些bean如何重新創建,因爲容器已經啓動。有沒有辦法在不重新啓動應用程序服務器的情況下重新啓動Spring IoC容器?春豆銷燬方法

回答

4

一個例子是DataSource或任何需要清理的資源。你可能有這樣的事情:

@Bean(destroyMethod = "close") 
DataSource dataSource() { 
.... 
} 

這可與多個類加載器像一個應用服務器,以防止內存泄漏的環境中尤其重要。

有時候這樣做是多餘的,因爲底層資源可能會自行清理(比如說,作爲servlet生命週期中contextDestroyed事件的一部分),但您應該始終驗證這一點。

這些彈簧docs也是一個有用的參考。 ,引用的例子有類似:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> 

然後bean類:

public class ExampleBean { 

    public void cleanup() { 
     // do some destruction work (like releasing pooled connections) 
    } 
} 

有可能刷新上下文。這answer提供了一個很好的解釋,當你可能想要做到這一點。

1

波紋管是我的看法:

這可能是一個可能的實例的使用在現實世界的應用程序破壞方法的?

對於大多數應用程序,也許我們專注於真正的企業居多,所以我們不常見面,其中需要定義破壞方法場景。但是,當你滿足一些基本的組件或中間件,則需要注意資源管理,如數據庫連接內存使用磁盤使用等。你必須知道如何明確釋放不必要的資源控股,否則這會造成嚴重的問題。

如果beans是由Spring容器爲Web應用程序創建的,例如ContextLoaderListener,那麼這些bean如何重新創建,因爲容器已經啓動了?

Spring容器不僅爲Web應用程序,它可以成爲常見的Java應用程序(主要用途)。Spring容器有兩種不同的Bean類型辛格爾頓原型),辛格爾頓豆只能提前實例化時Spring容器完成啓動,而bean原型將通過調用被實例化getBean每次。

有沒有辦法在不重啓應用程序服務器的情況下重新啓動Spring IoC容器?

Spring IoC容器開始通過調用AbstractRefreshableApplicationContext.refresh()方法進行實例化。如果您以前實例化了Container,則此方法將銷燬整個Spring IoC Container。因此,您可以調用此方法重新實例化Container。如果您想了解的Spring IoC機制,我建議你閱讀了Spring的源代碼:彈簧核心彈簧豆春天上下文

希望能幫到你。

0

我在Spring應用程序中看到了bean,它直接或間接地啓動了非守護進程線程。然後在不殺死流程的情況下停止流程變得不可能。這影響了一些處理自動化測試的Jenkins作業。所以在DevOps世界裏有很多真實世界的例子