【问题标题】:When do we use a SpringApplicationBuilder?我们什么时候使用 SpringApplicationBuilder?
【发布时间】:2017-08-28 15:51:15
【问题描述】:

我正在阅读 Spring Microservices 教程,其中包含以下内容:

new SpringApplicationBuilder(ZuulApplication.class).web(true).run(args);

大多数时候我看到这个是为了启动一个 Spring Boot 应用程序:

SpringApplication.run(Application.class, args);

这是我第一次看到 SpringApplicationBuilder。我们一般什么时候应该使用它?

【问题讨论】:

  • 你读过课堂上的Javadocs吗?
  • 我做到了。看起来它们是相似的类,但 SpringApplicationBuilder 提供了更多的控制,就配置文件等而言。在这种情况下,虽然看起来 ZuulApplication 可能只使用 SpringApplication 就可以了,但作者选择使用 SpringApplicationBuilder ...?
  • 在这种情况下,看起来确实没有必要使用。 web 参数通常是根据适当的依赖关系是否可用而自动确定的;将其显式设置为 true 将导致启动失败或冗余。
  • 确实——我觉得这很奇怪......

标签: java spring spring-boot


【解决方案1】:

我遇到的一个常见用例是,当您希望在 Weblogic 等中部署传统的部署战争文件时 - Traditional deployment

使用 SpringApplication ,大多数应用程序设置都具有硬编码的默认值,例如要使用的配置文件和属性文件等。您需要查看此类的代码才能理解这一点。

使用 SpringApplicationBuilder ,您可以在应用程序启动之前简单地更改其中的一些应用程序默认设置,即使这些设置中的大多数都具有合理的默认值。因此,只需几行代码,您就可以为不同的目的(嵌入式部署、外部部署、测试等)构建具有不同设置的不同应用程序,而您的实际底层业务逻辑保持不变。

【讨论】:

    【解决方案2】:

    假设您必须解决一个问题,您需要使用多个数据库或结构,并且每个数据库或结构都需要相互隔离,在这种情况下,我会使用SpringApplicationBuilder 方法,因为每个域都可以通过创建父上下文和子上下文进行隔离,无需混合不同的域问题,例如,您可以有 Application1 和 Application2 配置,每个配置都有自己的域、控制器和存储库,但您不想混合所有这种复杂性,而不是您可以使用 SpringApplicationBuilder 创建两个不同的配置

     SpringApplicationBuilder appBuilder = new SpringApplicationBuilder()
            .sources(Parent.class);
    
     appBuilder.child(Application1.class).run(args);
     appBuilder.child(Application2.class).run(args);
    

    一些附加信息:Post with an example of SpringApplicationBuilderJava Doc of SpringBuilderOther example of how use SpringApplicationBuilder

    【讨论】:

      【解决方案3】:

      在我们的应用程序中,我们在starter 应用程序中使用了SpringApplicationBuilderstarter 是一个简单的应用程序,它将以编程方式启动实际的应用程序实例。

      基于将启动应用程序实例的参数,要启动的进程数和进程 web/standalone 的类型将作为参数传递给 starter 应用程序。我们使用-w 作为状态管理的Web 应用程序启动。

      boolean isWeb = // options parser, parse -w
      new SpringApplicationBuilder(SpringBootAngularApp.class).web(isWeb).run(args);
      

      还有另一种方法可以做到这一点

      SpringApplication sp = new SpringApplication(SpringApplicationBuilder.class);       
      sp.setWebEnvironment(false);
      sp.run(args);
      

      我们还可以通过SpringApplicationBuilder自定义横幅、记录器。

      阅读文档了解更多用法

      【讨论】:

        猜你喜欢
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2012-05-28
        • 2011-07-04
        • 2019-07-30
        • 2017-09-13
        相关资源
        最近更新 更多