代码之家  ›  专栏  ›  技术社区  ›  LiorH

不使用singleton从非bean对象获取Spring应用程序上下文

  •  9
  • LiorH  · 技术社区  · 16 年前

    我需要从非bean对象获取Spring应用程序上下文。在so的另一个线程中,接受的答案建议使用singleton获取应用程序上下文。 Getting Spring Application Context

    但是使用singleton会使我的代码更耦合、更不易测试,这是许多线程中讨论的常见问题(例如 What is so bad about Singletons )

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

    2 回复  |  直到 12 年前
        1
  •  7
  •   krosenvold    16 年前

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

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

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

        2
  •  8
  •   mickeymoon    12 年前

    我想你的问题和我几天前的问题差不多。我认为以下几点对你有用:

    首先创建一个名为 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 实例使用以下代码段获取任何其他代码段 春豆:

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

    这将给您代码中任何地方的bean实例。