springboot2.6.2系列教程之SpringApplication-3

SpringApplication

该类SpringApplication提供了一种方便的方法来引导从main()方法启动的 Spring 应用程序。在许多情况下,您可以委托给静态SpringApplication.run方法,如下例所示:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

当您的应用程序启动时,您应该会看到类似于以下输出的内容

启动失败

如果您的应用程序无法启动,注册FailureAnalyzers者将有机会提供专门的错误消息和解决问题的具体措施。

如果没有故障分析器能够处理异常,您仍然可以显示完整的条件报告以更好地了解问题所在。为此,您需要启用该debug属性。

例如,如果您使用 运行应用程序,则可以按如下java -jar方式启用该属性:debug

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

延迟初始化

SpringApplication允许延迟初始化应用程序。当启用延迟初始化时,bean 会在需要时创建,而不是在应用程序启动期间创建。因此,启用延迟初始化可以减少应用程序启动所需的时间。在 Web 应用程序中,启用延迟初始化将导致许多与 Web 相关的 bean 在收到 HTTP 请求之前不会被初始化。

延迟初始化的一个缺点是它会延迟应用程序问题的发现。如果配置错误的 bean 被延迟初始化,则在启动期间将不再发生故障,并且只有在 bean 初始化时问题才会变得明显。还必须注意确保 JVM 有足够的内存来容纳应用程序的所有 bean,而不仅仅是那些在启动期间初始化的 bean。由于这些原因,默认情况下不启用延迟初始化,建议在启用延迟初始化之前对 JVM 的堆大小进行微调。

可以使用spring.main.lazy-initialization以下示例中所示的属性启用它:

spring:
  main:
    lazy-initialization: true

自定义banner

banner.txt可以通过将文件添加到类路径或将spring.banner.location属性设置为此类文件的位置来更改启动时打印的横幅。

自定义 SpringApplication

如果SpringApplication默认值不符合您的口味,您可以改为创建本地实例并对其进行自定义。例如,要关闭横幅,您可以编写:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(MyApplication.class);
        application.setBannerMode(Banner.Mode.OFF);
        application.run(args);
    }

}

也可以SpringApplication使用application.properties文件进行配置。

流畅的构建器 API

如果您需要构建ApplicationContext层次结构(具有父/子关系的多个上下文),或者如果您更喜欢使用“流利的”构建器 API,则可以使用SpringApplicationBuilder.

允许您将SpringApplicationBuilder多个方法调用和包含parent以及child允许您创建层次结构的方法链接在一起,如以下示例所示:

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

ApplicationContext创建层次结构 时有一些限制。例如,Web 组件必须包含在子上下文中,并且同样Environment用于父上下文和子上下文。

应用程序可用性

当部署在平台上时,应用程序可以使用Kubernetes Probes等基础设施向平台提供有关其可用性的信息。Spring Boot 包括对常用“liveness”和“readiness”可用性状态的开箱即用支持。如果您使用 Spring Boot 的“执行器”支持,那么这些状态将作为健康端点组公开。

此外,您还可以通过将ApplicationAvailability接口注入到自己的 bean 中来获取可用性状态。

活跃状态

应用程序的“活跃度”状态表明其内部状态是否允许其正常工作,或者如果当前失败则自行恢复。损坏的“活动”状态意味着应用程序处于无法恢复的状态,基础设施应重新启动应用程序。

准备状态

应用程序的“就绪”状态表明应用程序是否已准备好处理流量。失败的“就绪”状态告诉平台它现在不应该将流量路由到应用程序。这通常发生在启动期间、CommandLineRunner处理ApplicationRunner组件时,或者在应用程序决定它太忙而无法获得额外流量的任何时候。

一旦调用了应用程序和命令行运行器,就认为应用程序已准备就绪.

管理应用程序可用性状态

应用程序组件可以随时检索当前的可用性状态,方法是注入ApplicationAvailability接口并在其上调用方法。更多时候,应用程序会想要监听状态更新或更新应用程序的状态。

例如,我们可以将应用程序的“Readiness”状态导出到一个文件中,以便 Kubernetes “exec Probe”可以查看这个文件:

@Component
public class MyReadinessStateExporter {

    @EventListener
    public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) {
        switch (event.getState()) {
        case ACCEPTING_TRAFFIC:
            // create file /tmp/healthy
            break;
        case REFUSING_TRAFFIC:
            // remove file /tmp/healthy
            break;
        }
    }

}

我们还可以在应用中断且无法恢复时更新应用的状态:

@Component
public class MyLocalCacheVerifier {

    private final ApplicationEventPublisher eventPublisher;

    public MyLocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void checkLocalCache() {
        try {
            // ...
        }
        catch (CacheCompletelyBrokenException ex) {
            AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
        }
    }

}

Spring Boot通过 Actuator Health Endpoints 为“Liveness”和“Readiness”提供 Kubernetes HTTP 探测

应用程序事件和监听器

当您的应用程序运行时,应用程序事件按以下顺序发送:

  1. AnApplicationStartingEvent在运行开始时但在任何处理之前发送,除了侦听器和初始化程序的注册。
  2. ApplicationEnvironmentPreparedEventEnvironment在上下文中使用的 已知但在创建上下文之前发送一个。
  3. ApplicationContextInitializedEventApplicationContext准备好并调用 ApplicationContextInitializers 但在加载任何 bean 定义之前发送一个。
  4. ApplicationPreparedEvent在刷新开始之前但在加载 bean 定义之后发送一个。
  5. AnApplicationStartedEvent在上下文刷新之后但在调用任何应用程序和命令行运行程序之前发送。
  6. AvailabilityChangeEvent在 with 之后立即发送一个LivenessState.CORRECT,表明应用程序被认为是活动的。
  7. ApplicationReadyEvent在调用任何应用程序和命令行运行程序后发送一个。
  8. AvailabilityChangeEvent在 with 之后立即发送一个ReadinessState.ACCEPTING_TRAFFIC,表示应用程序已准备好为请求提供服务。
  9. 如果ApplicationFailedEvent启动时出现异常,则发送一个。

上面的列表仅包括SpringApplicationEvent与 a绑定的 s SpringApplication。除此之外,还发布了以下事件 afterApplicationPreparedEvent和 before ApplicationStartedEvent

  • A在准备好 WebServerInitializedEvent后发送。和分别是 servlet 和响应式变体。WebServer``ServletWebServerInitializedEvent``ReactiveWebServerInitializedEvent
  • A在刷新ContextRefreshedEvent时发送。ApplicationContext

环境类型

SpringApplication尝试ApplicationContext代表您创建正确的类型。用于确定 WebApplicationType 的算法如下:

  • 如果存在 Spring MVC,则使用AnnotationConfigServletWebServerApplicationContext
  • 如果 Spring MVC 不存在而 Spring WebFlux 存在,则使用AnnotationConfigReactiveWebServerApplicationContext
  • 否则,使用AnnotationConfigApplicationContext

这意味着如果您WebClient在同一个应用程序中使用 Spring MVC 和 Spring WebFlux ,则默认情况下将使用 Spring MVC。您可以通过调用轻松覆盖它setWebApplicationType(WebApplicationType)

使用 ApplicationRunner 或 CommandLineRunner

如果您需要在启动后运行某些特定代码SpringApplication,您可以实现ApplicationRunnerCommandLineRunner接口。两个接口以相同的方式工作并提供一个run方法,该方法在完成之前调用SpringApplication.run(…)

接口以字符串数组的CommandLineRunner形式提供对应用程序参数的访问,而ApplicationRunner使用ApplicationArguments前面讨论的接口。以下示例显示了一个CommandLineRunner带有方法的run方法:

@Component
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) {
        // Do something...
    }

}

如果定义了必须按特定顺序调用的多个CommandLineRunner,则可以另外实现接口ApplicationRunner或使用注解Order。

应用程序退出

每个都SpringApplication向 JVM 注册一个关闭钩子,以确保ApplicationContext在退出时优雅地关闭。可以使用所有标准的 Spring 生命周期回调(例如DisposableBean接口或@PreDestroy注解)。

此外,如果 bean希望在被调用org.springframework.boot.ExitCodeGenerator时返回特定的退出代码,它们可以实现该接口。SpringApplication.exit()然后可以将此退出代码传递给以将System.exit()其作为状态代码返回,如以下示例所示:

@SpringBootApplication
public class MyApplication {

    @Bean
    public ExitCodeGenerator exitCodeGenerator() {
        return () -> 42;
    }

    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(MyApplication.class, args)));
    }

}

此外,ExitCodeGenerator接口可能由异常实现。当遇到这样的异常时,Spring Boot 返回实现的getExitCode()方法提供的退出代码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕布辕门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值