2

我正在尝试将一个对象注入到单例类实现中。像这样的东西

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 调用。

我可以在我的 main 方法中做一个 getBean(我正在那里访问应用程序上下文),但是我只是希望这个 Wrapper 类负责创建这个单例。需要 MyObject 的对象只需调用 MyObjectWrapper.getImpl() 即可获得一个单例对象。

任何对此的反馈将不胜感激。

4

1 回答 1

5

这不起作用,因为您正在MyWrapperObject静态getInstance()方法中实例化 的新实例。因为您正在实例化它,所以 bean不是Spring 管理的,因此Spring 不会调用ApplicationContextAware方法 , 。setApplicationContext(...)

我不喜欢这段代码,但如果你想做这样的事情,我确实有一个建议。不要将其保存ApplicationContext到实例成员,而是将其保存到静态成员。然后,在您的静态getInstance()方法中,不要创建 的新实例MyWrapperObject,只需使用ApplicationContext您必须创建的实例的静态MyObject。如果这个类确实是一个 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;
    }
}

另外,不要让你的 object public。它是一个单例是有原因的。您希望调用getInstance()的每个人都获得相同的对象实例。如果你成功了public,那么任何人都可以拿到它,如果他们愿意,可以重新分配它。它有点违背了目的......

于 2012-04-28T05:32:08.743 回答