目录
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 探测。
应用程序事件和监听器
当您的应用程序运行时,应用程序事件按以下顺序发送:
- An
ApplicationStartingEvent
在运行开始时但在任何处理之前发送,除了侦听器和初始化程序的注册。 ApplicationEnvironmentPreparedEvent
当Environment
在上下文中使用的 已知但在创建上下文之前发送一个。ApplicationContextInitializedEvent
当ApplicationContext
准备好并调用 ApplicationContextInitializers 但在加载任何 bean 定义之前发送一个。ApplicationPreparedEvent
在刷新开始之前但在加载 bean 定义之后发送一个。- An
ApplicationStartedEvent
在上下文刷新之后但在调用任何应用程序和命令行运行程序之前发送。 AvailabilityChangeEvent
在 with 之后立即发送一个LivenessState.CORRECT
,表明应用程序被认为是活动的。ApplicationReadyEvent
在调用任何应用程序和命令行运行程序后发送一个。AvailabilityChangeEvent
在 with 之后立即发送一个ReadinessState.ACCEPTING_TRAFFIC
,表示应用程序已准备好为请求提供服务。- 如果
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
,您可以实现ApplicationRunner
或CommandLineRunner
接口。两个接口以相同的方式工作并提供一个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()
方法提供的退出代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!