gpt4 book ai didi

spring - 在 Singleton 类中使用 ApplicationContextAware

转载 作者:行者123 更新时间:2023-12-02 22:43:44 24 4
gpt4 key购买 nike

我正在尝试将一个对象注入(inject)到单例类实现中。像这样

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() 时,我得到一个 null MyObject。我有 myobject 和 MyObjectWrapper 的 bean 条目。

  2. 我知道使用 getBean 不是最佳做法,但在这个特定示例中是否可以接受?缺点是什么?如果不在这里,我将在我的 Main 方法中进行类似的 getBean 调用。

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

如有任何反馈,我们将不胜感激。

最佳答案

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

我不喜欢这段代码,但如果你想做这样的事情,我有一个建议。不是将 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;
}
}

另外,不要让你的对象public。这是一个单例是有原因的。您希望调用 getInstance() 的每个人都获得对象的相同实例。如果您将其设置为public,那么任何人都可以获取它并根据需要重新分配它。它有点违背了目的......

关于spring - 在 Singleton 类中使用 ApplicationContextAware,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com