我需要從非bean對象獲取Spring應用程序上下文。在SO的另一個線程中,接受的答案建議使用單例來獲取應用程序上下文。 Getting Spring Application Context在不使用Singleton的情況下從非Bean對象獲取Spring應用程序上下文
但是,使用單讓我的代碼更加上少可測試,可在多個線程討論的常見問題(如What is so bad about Singletons)
的問題,是有一種優雅的方式來獲得非bean的應用程序上下文對象不使用單例?
我需要從非bean對象獲取Spring應用程序上下文。在SO的另一個線程中,接受的答案建議使用單例來獲取應用程序上下文。 Getting Spring Application Context在不使用Singleton的情況下從非Bean對象獲取Spring應用程序上下文
但是,使用單讓我的代碼更加上少可測試,可在多個線程討論的常見問題(如What is so bad about Singletons)
的問題,是有一種優雅的方式來獲得非bean的應用程序上下文對象不使用單例?
始終存在引導問題。對於Web應用程序,通常有處理這種情況的外部servlet過濾器。
如果不是網絡應用,那麼圍繞某種外部單例或引導程序是沒有辦法的。但;在這裏使用單例只會影響單個引導程序類的可測試性。應該只有很少的地方需要以任何明確的方式引用容器。所以它不會顯着增加耦合。
或者換句話說,應該只有非常少的需要訪問spring容器的非bean對象。如果情況並非如此,那麼你可能沒有最佳使用彈簧。而大多數/所有那些需要容器應該可能只是實施BeanFactoryAware或ApplicationContextAware
我認爲你的問題是幾乎相同的我有幾天回來。我認爲有以下應爲你工作:
首先創建一個名爲AppContextManager
類象下面這樣:
@Component
public class AppContextManager implements ApplicationContextAware{
private static ApplicationContext _appCtx;
@Override
public void setApplicationContext(ApplicationContext ctx){
_appCtx = ctx;
}
public static ApplicationContext getAppContext(){
return _appCtx;
}
}
標註上述類@Component
或在你application context xml
申報AppContextManager一個bean。
現在,在您non-singleton
non-spring
例如使用下面的代碼片段獲得任何其他 的Spring bean:
ApplicationContext ctx = ApplicationContextManager.getAppContext();
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class);
,這將隨時隨地讓你在你的代碼的bean實例。
這沒有奏效。 – 2014-03-02 22:41:22
+1。應用程序代碼中通常應避免使用單例。對於某些類型的引導或基礎設施來說,這不是什麼大問題。無論如何,你不需要單獨測試你的引導程序。 :) – 2009-01-24 21:49:42