2012-04-28 36 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,那么任何人都可以得到它并重新分配它,如果他们想要的话。它有点击败目的...