Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 从非bean对象获取Spring应用程序上下文而不使用单例_Design Patterns_Spring_Singleton - Fatal编程技术网

Design patterns 从非bean对象获取Spring应用程序上下文而不使用单例

Design patterns 从非bean对象获取Spring应用程序上下文而不使用单例,design-patterns,spring,singleton,Design Patterns,Spring,Singleton,我需要从非bean对象获取spring应用程序上下文。在SO的另一个线程中,公认的答案建议使用singleton获取应用程序上下文。 但是使用singleton会使我的代码更具耦合性和可测试性,这是许多线程中讨论的常见问题(例如) 问题是,有没有一种优雅的方法可以从非bean对象获取应用程序上下文而不使用单例?始终存在引导问题。对于web应用程序,通常有外部servlet过滤器来处理这种情况 如果不是web应用程序,就没有办法绕过某种外部单例或引导程序。但是在这里使用单例应该只影响单个引导程序

我需要从非bean对象获取spring应用程序上下文。在SO的另一个线程中,公认的答案建议使用singleton获取应用程序上下文。

但是使用singleton会使我的代码更具耦合性和可测试性,这是许多线程中讨论的常见问题(例如)


问题是,有没有一种优雅的方法可以从非bean对象获取应用程序上下文而不使用单例?

始终存在引导问题。对于web应用程序,通常有外部servlet过滤器来处理这种情况

如果不是web应用程序,就没有办法绕过某种外部单例或引导程序。但是在这里使用单例应该只影响单个引导程序类的可测试性。代码中应该只有很少的地方需要以任何显式方式引用容器。所以它实际上并没有显著增加耦合


或者换言之,实际上应该只有很少的非bean对象需要访问spring容器。如果不是这样,那么您可能没有最佳地使用spring。而大多数/所有需要该容器的人可能只需要实现或

我认为你的问题与我几天前遇到的差不多。我认为以下几点应该适合你:

首先创建一个名为
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
注释上述类,或者在
应用程序上下文xml
中为AppContextManager声明一个bean

现在,在您的
非单例
非spring
实例中,使用以下代码片段获取任何其他 春豆:

ApplicationContext ctx = ApplicationContextManager.getAppContext();
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class);

这将在代码中的任何地方为您提供bean实例。

+1。通常应避免在应用程序代码中使用单例。对于某些类型的自举或基础设施来说,这不是什么大问题。很有可能,无论如何,您都不需要对引导程序进行单元测试。:)您是否为AppContextManager正确创建了bean。。您的bean应该位于由
组件扫描基本包
配置定义的包中,或者在您的应用程序上下文xml中声明相同的bean。@mickeymoon感谢您的回答,这对我真的很有帮助。我知道这是一个非常古老的问题,但我已经见过这个解决方案好几次了,我不确定它应该如何工作。如果在非SPRING类中有一个ApplicationContext类型的对象,那么必须有一个SPRING依赖项否?或者你不能调用getBean方法。它工作得很好,谢谢!如果派生类的结构可以负担得起(或普通单例),那么可以在这个基类中@Autowire components/bean