10

我需要从非 bean 对象中获取 spring 应用程序上下文。在 SO 的另一个线程中,接受的答案建议使用单例来获取应用程序上下文。 获取 Spring 应用程序上下文

但是使用单例使我的代码更加耦合且可测试性更低,这是许多线程中讨论的常见问题(例如Singletons 有什么不好

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

4

2 回答 2

8

总是存在引导问题。对于 Web 应用程序,通常有处理这种情况的外部 servlet 过滤器。

如果不是网络应用程序,那么就无法绕过某种外部单例或引导程序。但; 在此处使用单例只会影响该单个引导程序类的可测试性。您的代码中应该只有很少的地方需要以任何显式方式引用容器。所以它并没有真正显着增加耦合。

或者换一种说法,实际上应该只有很少的非 bean 对象需要访问 spring 容器。如果不是这种情况,那么您可能没有最佳地使用弹簧。大多数/所有需要容器的人可能应该只实现BeanFactoryAwareApplicationContextAware

于 2009-01-24T09:43:04.480 回答
8

我认为您的问题与我几天前的问题差不多。我认为以下内容应该适合您:

首先创建一个类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 实例。

于 2012-10-10T08:58:37.593 回答