2012-04-28 86 views
2

我正在嘗試將一個對象注入到一個單例類實現中。這樣在Singleton類中使用ApplicationContextAware

public class MyObjectWrapper implements ApplicationContextAware { 

    public static MyObject myObject; 
    private ApplicationContext ctxt; 
    private MyObjectWrapper() {} 

    public static synchronized MyObject getImpl() { 
     if (myObject!=null) 
      return myObject; 

     MyObjectWrapper myObjectWrapper=new MyObjectWrapper(); 
     this.myObject = (MyObject) myObjectWrapper.getCtxt().getBean("myobject"); 
     return myObject; 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) 
      throws BeansException { 
     logger.debug("setApplicationContext - " + arg0); 
     this.ctxt = arg0; 
    } 

    public ApplicationContext getCtxt() { 
     return ctxt; 
    } 

    public void setCtxt(ApplicationContext ctxt) { 
     this.ctxt = ctxt; 
    } 

} 
  1. 它不工作的東西,這是我的呼喚MyObjectWrapper.getImpl()我得到一個空的MyObject。我有myobject和MyObjectWrapper bean條目。

  2. 我知道使用的getBean是不是最好的做法,但在這個特殊的例子是可以接受的?缺點是什麼?如果不在這裏,我將在我的Main方法中做類似的getBean調用。

我可以在我的主要方法(我訪問那裏的應用程序上下文)做的getBean,但我只是想這包裝類來負責建立這一單的。需要MyObject的對象可以調用MyObjectWrapper.getImpl()並獲得一個單例對象。

任何有關同樣的反饋將不勝感激。

回答

6

這是行不通的,因爲你是在靜態getInstance()方法實例的MyWrapperObject一個新的實例。因爲你正在實例化它,所以Spring將不會調用Spring,因此ApplicationContextAware方法,setApplicationContext(...)不會被Spring調用。

我不是這個代碼的粉絲,但是如果你想要做這樣的事情,我也有一個建議。而不是將ApplicationContext保存到實例成員,而是將其保存到靜態成員。然後,在靜態getInstance()方法,不要創造MyWrapperObject一個新實例,僅使用你需要創建的MyObject實例的靜態ApplicationContext。如果這個類確實是一個Spring單例,那麼你應該沒有什麼可擔心的。

事情是這樣的:

public class MyObjectWrapper implements ApplicationContextAware { 
    private static MyObject myObject; 
    private static ApplicationContext ctxt; 
    private MyObjectWrapper() {} 

    public static synchronized MyObject getImpl() { 
     if (myObject!=null) 
      return myObject; 

     this.myObject = ctxt.getBean("myobject", MyObject.class); 
     return myObject; 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext arg0) throws BeansException { 
     ctxt = arg0; 
    } 
} 

此外,不要讓你的對象public。這是一個單身的理由。您希望每個調用getInstance()的人都獲得相同的對象實例。如果你製作了public,那麼任何人都可以得到它並重新分配它,如果他們想要的話。它有點擊敗目的...