我需要从非 bean 对象中获取 spring 应用程序上下文。在 SO 的另一个线程中,接受的答案建议使用单例来获取应用程序上下文。 获取 Spring 应用程序上下文
但是使用单例使我的代码更加耦合且可测试性更低,这是许多线程中讨论的常见问题(例如Singletons 有什么不好)
问题是,是否有一种优雅的方法可以在不使用单例的情况下从非 bean 对象获取应用程序上下文?
我需要从非 bean 对象中获取 spring 应用程序上下文。在 SO 的另一个线程中,接受的答案建议使用单例来获取应用程序上下文。 获取 Spring 应用程序上下文
但是使用单例使我的代码更加耦合且可测试性更低,这是许多线程中讨论的常见问题(例如Singletons 有什么不好)
问题是,是否有一种优雅的方法可以在不使用单例的情况下从非 bean 对象获取应用程序上下文?
总是存在引导问题。对于 Web 应用程序,通常有处理这种情况的外部 servlet 过滤器。
如果不是网络应用程序,那么就无法绕过某种外部单例或引导程序。但; 在此处使用单例只会影响该单个引导程序类的可测试性。您的代码中应该只有很少的地方需要以任何显式方式引用容器。所以它并没有真正显着增加耦合。
或者换一种说法,实际上应该只有很少的非 bean 对象需要访问 spring 容器。如果不是这种情况,那么您可能没有最佳地使用弹簧。大多数/所有需要容器的人可能应该只实现BeanFactoryAware或ApplicationContextAware
我认为您的问题与我几天前的问题差不多。我认为以下内容应该适合您:
首先创建一个类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
.
现在在您的non-singleton
non-spring
实例中使用以下代码片段来获取任何其他 Spring bean:
ApplicationContext ctx = ApplicationContextManager.getAppContext();
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class);
这将为您提供代码中任何位置的 bean 实例。