2014-10-17 38 views
1

我想使用spring創建jar庫並將它們導入到我的Web應用程序中。因爲我也在後者中使用了spring,所以我沒有任何問題。關鍵是我想在非春季託管環境中重複使用它。 假設我想在純javaee web應用中使用lib,那麼我不能使用spring自動裝配和打包掃描功能。 我的想法是:在其costructor創建一個簡單的純豆和負載Spring配置:如何在不受彈簧管理的Web應用程序中創建/加載自定義彈簧罐

public class SpringStandalone{ 

private Client      client; 
private AnnotationConfigApplicationContext ctx; 

public SpringStandalone() { 
    ctx = new AnnotationConfigApplicationContext(); 
    ctx.getEnvironment().setActiveProfiles("test"); 
    ctx.scan("my.package.scan"); 
    ctx.refresh(); 
    client = (Client) ctx.getBean(Client.class); 
    ctx.destroy(); 
} 

public void send(Object o) { 
    client.send(o); 
} 

} 

這是正確的方式做到這一點?如果是這樣,我應該如何管理applicationContext destroy(我應該打擾它嗎?)?

在此先感謝您的幫助。

法比奧

回答

1

不能破壞春天應用程序上下文和希望,您的客戶對象將正常工作。
相反,您應該提供一個單獨的'SpringStandalone.destroy()'方法,客戶端代碼將在不再需要SpringStandalone類時調用。

注意,調用ctx.destroy()不僅僅是清除Spring容器,但也引發了一些「業務」的行爲,如調用與@PreDestroy,出版停工情況等註解所有bean的方法。因此,當您不再需要SpringStandalone對象時,最好調用它。

我相信你的方法沒有錯。
請注意,加載Spring應用上下文需要時間,因此您只需創建一次SpringStandalone。

+0

好吧,在此期間,我將springStandalone類更改爲單例,以便僅獲得一個實例(如您所建議的那樣)。因爲客戶端必須活着,只要託管的網絡應用程序生活,然後我想毀滅操作匹配應用程序關閉。我對嗎?無論如何謝謝你的回答。 – Pirulino 2014-10-17 19:50:28

+0

是的,如果客戶端bean應該活着,只要應用程序存在,destroy操作應該匹配應用程序關閉。至於單身人士,在我看來,這只是其中一種可能的解決方案,明顯的缺點是這是一個全球變數,其所有的缺陷。另一個注意事項:你想在你的應用程序啓動時檢測你的Spring配置問題,但是單例模式可能會推遲SpringStandalone的創建,直到第一次使用,所以我建議在你的應用程序啓動時進行明確的調用以觸發創建。 – Alexander 2014-10-18 09:54:47

+0

我同意你的意見。謝謝您的幫助。 – Pirulino 2014-10-20 19:06:23

相關問題