2009-01-24 66 views
8

我需要從非bean對象獲取Spring應用程序上下文。在SO的另一個線程中,接受的答案建議使用單例來獲取應用程序上下文。 Getting Spring Application Context在不使用Singleton的情況下從非Bean對象獲取Spring應用程序上下文

但是,使用單讓我的代碼更加上少可測試,可在多個線程討論的常見問題(如What is so bad about Singletons

的問題,是有一種優雅的方式來獲得非bean的應用程序上下文對象不使用單例?

回答

7

始終存在引導問題。對於Web應用程序,通常有處理這種情況的外部servlet過濾器。

如果不是網絡應用,那麼圍繞某種外部單例或引導程序是沒有辦法的。但;在這裏使用單例只會影響單個引導程序類的可測試性。應該只有很少的地方需要以任何明確的方式引用容器。所以它不會顯着增加耦合。

或者換句話說,應該只有非常少的需要訪問spring容器的非bean對象。如果情況並非如此,那麼你可能沒有最佳使用彈簧。而大多數/所有那些需要容器應該可能只是實施BeanFactoryAwareApplicationContextAware

+0

+1。應用程序代碼中通常應避免使用單例。對於某些類型的引導或基礎設施來說,這不是什麼大問題。無論如何,你不需要單獨測試你的引導程序。 :) – 2009-01-24 21:49:42

7

我認爲你的問題是幾乎相同的我有幾天回來。我認爲有以下應爲你工作:

首先創建一個名爲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-singletonnon-spring例如使用下面的代碼片段獲得任何其他 的Spring bean:

ApplicationContext ctx = ApplicationContextManager.getAppContext(); 
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class); 

,這將隨時隨地讓你在你的代碼的bean實例。

+1

這沒有奏效。 – 2014-03-02 22:41:22

相關問題