【问题标题】:Using Spring in standalone apps在独立应用程序中使用 Spring
【发布时间】:2012-03-29 07:52:51
【问题描述】:

我正在学习 Spring,我有一个关于如何在独立应用程序中使用它的问题(以及在使用它来制作 Web 应用程序时)。到目前为止,我编写的示例使用了一个简单的 main 方法,在该方法中我通过调用 getBean 来检索 bean。上下文对象。但是,您可能希望在多个类中执行此操作,所以您首先获取上下文然后调用 getBean 还是有其他更简洁的替代方法?还是您在独立应用程序和网络应用程序中这样做?

【问题讨论】:

    标签: java spring jakarta-ee


    【解决方案1】:

    你在正确的路线上。如您所见,您的 main 方法将初始化您的应用程序上下文。然后诀窍是使用该应用程序上下文来创建应用程序的入口点。使用 spring 创建的 bean 已经为您连接好了..

    import org.springframework.beans.factory.BeanFactoryUtils;
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class ApplicationMain {
    
        public static void main(String[] args) {
    
            AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/applicationContext.xml");
    
            MyApplication app = BeanFactoryUtils.beanOfType(ctx, MyApplication.class);
    
            app.init();
        }
    
    }
    

    【讨论】:

    • 我只需将 app.init 配置为应用程序的 init-method。这样就不需要查找和显式调用。一切都由spring处理。
    • @Laures - 同意,这可以变得更隐含,但有时显式调用会使事情更清晰。请注意,Spring 有 org.springframework.context.Lifecycle 接口,可以在此处应用。当 start()stop()isRunning() 在应用程序上下文中调用时,所有实现 Lifecycle 接口的 bean 都会调用等效的方法。在像这样的简单示例中,我认为这是矫枉过正。
    【解决方案2】:

    这取决于您正在编写的应用程序,但您应该将getBean() 调用限制为最少,最好是一个。您直接从上下文中获取第一个 bean,并将其余逻辑放在 bean 本身中。类似的东西:

    Bootstrap boot = context.getBean(Bootstrap.class);
    boot.start();
    

    所有其余的应用程序逻辑都在start() 中进行。它可以创建线程、监听事件等。

    【讨论】:

      【解决方案3】:

      如果你到处都调用context.getBean(),你可能错过了 Spring 的全部要点,它是一个依赖注入框架。

      在独立应用程序中,您通常只调用一次context.getBean()(或至少,非常少),以获得“根”bean。这个 bean 由 Spring 与其他 bean 一起注入,以此类推。

      在网络应用程序中,这完全取决于您使用的框架。但通常情况下,您在 web.xml 中注册一个侦听器,该侦听器会为您加载上下文,并且控制器由 Spring 创建和/或注入。

      【讨论】:

      • 哦,所以你只用它来引导应用程序。
      • 好的,谢谢。你能解释一下我错过了 DI 框架的意思吗?这样我就可以阅读了。另外为什么你应该只调用一次?
      • DI 实现了好莱坞的原则:“不要打电话给我,我会打电话给你”。目标是避免查找您的依赖项,而是让它们由 Spring 注入。这就是使单元测试变得如此容易的原因。如果您正在查找上下文中的所有 denendencies,那么您就不再进行 DI 了。您在 main 中调用它一次,因为它是绝对最小值。在其他任何地方,您都使用 DI。
      【解决方案4】:

      一个类(可能是你的主类)必须支持 Spring 才能创建上下文。所有其他类可以继续通过 Spring 连接在一起,并且不需要是上下文感知的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 2016-07-04
        • 2021-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        相关资源
        最近更新 更多