[TOC]
SpringApplication 是Spring Boot 提供的一个类,该类提供了一个便捷的方法引导Spring应用, 从应用的入口main() 方法启动应用, 主方法直接调用SpringApplication.run() 方法, 类似:
```
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
```
启动之后, 在控制台看到如下信息代表启动成功了。
```
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.0)
2021-11-24 07:01:30.951 INFO 1592 --- [ restartedMain] c.o.s.SpringbootEncyApplication : Starting SpringbootEncyApplication using Java 1.8.0_211 on LAPTOP-C6T2C3A5 with PID 1592 (D:\devworkspace\eclipse\springboot-ency\target\classes started by xuemi in D:\devworkspace\eclipse\springboot-ency)
2021-11-24 07:01:30.953 INFO 1592 --- [ restartedMain] c.o.s.SpringbootEncyApplication : No active profile set, falling back to default profiles: default
2021-11-24 07:01:30.992 INFO 1592 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-11-24 07:01:30.992 INFO 1592 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-11-24 07:01:31.598 INFO 1592 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-11-24 07:01:31.666 INFO 1592 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 60 ms. Found 2 JPA repository interfaces.
2021-11-24 07:01:32.502 INFO 1592 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-11-24 07:01:32.512 INFO 1592 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-11-24 07:01:32.512 INFO 1592 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-11-24 07:01:32.726 INFO 1592 --- [ restartedMain] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
2021-11-24 07:01:32.731 INFO 1592 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-11-24 07:01:32.731 INFO 1592 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1738 ms
2021-11-24 07:01:32.819 INFO 1592 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-11-24 07:01:33.046 INFO 1592 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-11-24 07:01:33.052 INFO 1592 --- [ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:236bfaf5-4084-41ad-8985-f5c858eff903'
2021-11-24 07:01:33.234 INFO 1592 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-11-24 07:01:33.279 INFO 1592 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.31.Final
2021-11-24 07:01:33.401 INFO 1592 --- [ restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-11-24 07:01:33.512 INFO 1592 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2021-11-24 07:01:34.076 INFO 1592 --- [ restartedMain] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2021-11-24 07:01:34.086 INFO 1592 --- [ restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2021-11-24 07:01:34.150 WARN 1592 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2021-11-24 07:01:35.020 INFO 1592 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2021-11-24 07:01:35.069 INFO 1592 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-24 07:01:35.078 INFO 1592 --- [ restartedMain] c.o.s.SpringbootEncyApplication : Started SpringbootEncyApplication in 4.466 seconds (JVM running for 4.96)
```
默认情况下,控制台会显示 INFO 日志消息,包括一些相关的启动详细信息,例如启动应用程序的用户。 如果需要 INFO 以外的日志级别,可以进行设置,参考本系列的“4.日志”。
可以通过将 `spring.main.log-startup-info `设置为 false 来关闭启动信息记录。
提示: 要在启动期间添加额外的日志记录,您可以在 SpringApplication 的子类中覆盖 logStartupInfo(boolean)。
## 1. 启动失败
如果应用启用失败, 注册`FailureAnalyzers`有机会获取更详细的错误信息和解决问题的方法。比如默认的8080端口被占用,会报如下错误信息:
```
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-11-24 07:03:29.531 ERROR 13088 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Web server failed to start. Port 8080 was already in use.
Action:
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
```
注意:Spring Boot 提供了许多 FailureAnalyzer 实现,也可以添加自己的。
如果没有错误分析器用来处理异常, 还是可以看到完整的报告来了解发生了什么错误, 只需要org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener 启用调试属性或启用调试日志记录。
比如: 如果使用java -jar 的方式运行应用程序, 则可以使用以下方式启动调试:
`java -jar myproject-0.0.1-SNAPSHOT.jar --debug`
## 2. 懒初始化
SpringApplication支持应用程序的懒初始化。启用懒初始化之后,Bean会在需要的时候加载, 而不是在应用启动时加载。懒初始化的好处是可以缩短应用启动的时间。 在Web应用中,懒初始化会让很多Web相关的Bean 直到接受到http请求的时候才初始化。
延迟初始化的一个缺点是它会延迟发现应用程序的问题。 如果一个错误配置的 bean 被延迟初始化,那么在启动过程中将不再发生故障,并且只有在 bean 初始化时问题才会被发现。 还必须注意确保 JVM 有足够的内存来容纳所有应用程序的 bean,而不仅仅是那些在启动期间初始化的 bean。 由于这些原因,默认情况下不启用延迟初始化,建议在启用延迟初始化之前对 JVM 的堆大小进行微调。
懒初始化启用的方式:
* 方式1: 配置属性: `spring.main.lazy-initialization=true`
* 方式2: 代码: SpringApplicationBuilder 的lazyInitialization()
* 方式3: 代码: SpringApplication 的setLazyInitialization()
提示: 如果设置了应用的延迟初始化, 但对于某些Bean又希望不延迟, 可以使用注解 `@Lazy(false)`。
## 3. 自定义启动的横幅标志
Spring Boot 启动的时候在控制台会打印一个Spring的横幅标志(如本篇开头的介绍)。该横幅标志可以自行修改, 修改的方式有:
* 在类路径添加 banner.txt 文件
* 也可以通过spring.banner.location设置文件位置
对于 非UTF-8编码的文件, 可以使用spring.banner.charset 设置字符集。
除了文本文件之外,也可以向类路径添加banner.gif、banner.jpg 或banner.png 图像文件,还可以设置spring.banner.image.location 属性。 图像被转换为 ASCII 艺术表现形式并打印。
在 banner.txt 文件中,可以使用以下占位符:
| 变量 | 描述 |
| --- | --- |
| ${application.version} | 应用的版本号,在MANIFEST.MF文件中, 类似: Implementation-Version: 1.0 |
|${application.formatted-version} | 应用程序的版本号,在 MANIFEST.MF 中声明并格式化以供显示(用括号括起来并以 v 为前缀)。 例如 (v1.0)。 |
| ${spring-boot.version} | Spring Boot 版本, 比如 2.6.0 |
| ${spring-boot.formatted-version} | Spring Boot 版本,已格式化以显示(用括号括起来并以 v 为前缀)。 例如 (v2.6.0) |
|`${Ansi.NAME}`(or`${AnsiColor.NAME}`,`${AnsiBackground.NAME}`,`${AnsiStyle.NAME}`) | NAME 是 ANSI 转义码的名称 |
| ${application.title} | 应用程序的标题,在 MANIFEST.MF 中声明。 例如,Implementation-Title: MyApp 打印为 MyApp。 |
提示: 以编程方式生成横幅,则可以使用 SpringApplication.setBanner(... ) 方法。 继承org.springframework.boot.Banner 接口并实现自己的 printBanner() 方法。
使用 spring.main.banner-mode 属性来控制横幅是否必须在 System.out(控制台)上打印,或是发送到配置的记录器(日志),或者根本不生成(关闭)
用来进行横幅打印的单例Bean的名字是 **springBootBanner**。
注意:
${application.version} 和 ${application.formatted-version} 属性仅在使用 Spring Boot 启动器时可用。 如果运行一个解压的 jar 并使用 java -cp <classpath> <mainclass> 启动它,这些值将不会被解析。
所以建议始终使用 java org.springframework.boot.loader.JarLauncher 启动解压的 jar。 这将在构建类路径和启动应用程序之前初始化 application.* 横幅变量。
## 4. 自定义SpringApplication
SpringApplication.run() 对应一个默认的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 的构造函数参数是 Spring bean 的配置源。 在大多数情况下,这些是对@Configuration 类的引用,但它们也可以是对@Component 类的直接引用。
也可以使用 application.properties 文件配置 SpringApplication。详细可以参考 “2.配置外部化”。
## 5. 流利的构建器 API
如果需要构建 ApplicationContext 层次结构(具有父/子关系的多个上下文),或者偏好使用“流畅”的构建器 API,则可以使用 SpringApplicationBuilder。
SpringApplicationBuilder 允许将多个方法调用链接在一起,并包含允许创建层次结构的父方法和子方法,如下所示:
```
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.run(args);
```
注意: 创建 ApplicationContext 层次结构时有一些限制。 例如,Web 组件必须包含在子上下文中,并且对父上下文和子上下文使用相同的环境。
## 6. 应用的可用性
在平台上部署时,应用程序可以使用 Kubernetes Probes 等基础设施向平台提供有关其可用性的信息。 Spring Boot 包括对常用“活跃”和“就绪”可用性状态的开箱即用支持。 如果使用 Spring Boot 的“actuator”支持,那么这些状态将作为健康端点组公开。
此外,还可以通过将 ApplicationAvailability 接口注入到自己的 bean 中来获取可用性状态。
#### 6.1 活跃状态(liveness)
应用程序的“活跃度”状态表明它的内部状态是否允许它正常工作,或者如果它当前失败则自行恢复。 损坏的“Liveness”状态意味着应用程序处于无法恢复的状态,基础设施应该重新启动应用程序。
注意: 一般来说,“Liveness”状态不应该基于外部检查,例如健康检查。 如果确实如此,则出现故障的外部系统(数据库、Web API、外部缓存)将触发整个平台的大规模重启和级联故障。
Spring Boot 应用程序的内部状态主要由 Spring ApplicationContext 表示。 如果应用程序上下文已成功启动,Spring Boot 会假定应用程序处于有效状态。 一旦上下文刷新,应用程序就被认为是活动的,可以参考 “1.7 应用事件和监听 ” 的介绍。
#### 6.2 就绪状态 (Readiness )
应用程序的“就绪”状态表明应用程序是否已准备好处理流量。 失败的“就绪”状态告诉平台它现在不应将流量路由到应用程序。 这通常发生在启动期间,同时正在处理 CommandLineRunner 和 ApplicationRunner 组件,或者在应用程序确定它太忙而无法增加流量时的任何时间。
一旦应用程序和命令行运行程序被调用,应用程序就被认为已准备就绪,请参考 “1.7 应用事件和监听 ” 的介绍
提示:预期在启动期间运行的任务应该由 CommandLineRunner 和 ApplicationRunner 组件执行,而不是使用 Spring 组件生命周期回调,例如 @PostConstruct。
#### 6.3 管理应用程序可用性状态
通过注入 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 探测。 可以参考: https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.cloud.kubernetes
## 7. 应用程序事件和侦听器
除了通常的 Spring Framework 事件(例如 ContextRefreshedEvent)之外,SpringApplication 还发送一些额外的应用程序事件。
注意:某些事件实际上是在创建 ApplicationContext 之前触发的,因此您不能将侦听器注册为 @Bean。 可以使用 SpringApplication.addListeners(… ) 方法或 SpringApplicationBuilder.listeners(… ) 方法注册它们。
应用程序运行时,应用程序事件按以下顺序发送:
1.
ApplicationStartingEvent, 启动后, 开始处理之前, 排除监听器和初始化器的注册
2. ApplicationEnvironmentPreparedEvent , 环境应用在上下文, 上下文创建之前
3. ApplicationContextInitializedEvent , ApplicationContext 准备好,ApplicationContextInitializers 被呼叫, Bean 的定义加载之前
4. ApplicationPreparedEvent , Bean 定义加载之后, 刷新之前
5. ApplicationStartedEvent , 刷新上下文之后但在调用任何应用程序和命令行运行程序之前。
6. AvailabilityChangeEvent 在LivenessState.CORRECT 之后, 应用启动
7. ApplicationReadyEvent 任何应用程序和命令行运行程序被调用后执行。
8. AvailabilityChangeEvent ,ReadinessState.ACCEPTING_TRAFFIC 之后,准备好可以处理请求
9. ApplicationFailedEvent , 启动异常
上面的列表仅包括绑定到 SpringApplication 的 SpringApplicationEvents。 除此之外,以下事件也在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前发布
1. WebServerInitializedEvent WebServer 准备就绪。ServletWebServerInitializedEvent 和 ReactiveWebServerInitializedEvent 分别是 servlet 和reactive
2. ContextRefreshedEvent , ApplicationContext 刷新之后
提示: 通常不需要使用应用程序事件,但知道它们存在会很方便。 在内部,Spring Boot 使用事件来处理各种任务。
注意:默认情况下,事件侦听器不应运行在同一线程中执行的潜在冗长任务。 考虑改用应用程序和命令行运行程序。
应用程序事件是使用 Spring Framework 的事件发布机制发送的。 此机制的一部分确保发布到子上下文中的侦听器的事件也发布到任何祖先上下文中的侦听器。 因此,如果应用程序使用 SpringApplication 实例的层次结构,则侦听器可能会收到同一类型应用程序事件的多个实例。
为了让侦听器区分其上下文的事件和后代上下文的事件,它应该请求注入其应用程序上下文,然后将注入的上下文与事件的上下文进行比较。 上下文可以通过实现 ApplicationContextAware 或者,如果监听器是一个 bean,通过使用 @Autowired 注入。
## 8. Web 环境
SpringApplication 尝试创建正确类型的 ApplicationContext。 如果是 Web应用,用于确定 WebApplicationType 的算法如下:
1. 如果存在 Spring MVC,则使用 AnnotationConfigServletWebServerApplicationContext
2. 如果 Spring MVC 不存在而 Spring WebFlux 存在,则使用 AnnotationConfigReactiveWebServerApplicationContext
3. 否则,使用 AnnotationConfigApplicationContext
如果同时存在Spring MVC 和Spring WebFlux, 则默认使用MVC, 可以使用 `setWebApplicationType(WebApplicationType). ` 进行设置。
也可以通过调用 setApplicationContextClass(… ) 来完全控制使用的 ApplicationContext 类型。
提示: 在 JUnit 测试中使用 SpringApplication 时,通常需要调用 setWebApplicationType(WebApplicationType.NONE)。
## 9. 访问应用程序参数
如果需要获取传递给 SpringApplication.run(... ) 的应用程序参数,可以注入一个 org.springframework.boot.ApplicationArguments 类型的bean。 ApplicationArguments 接口提供对原始 String[] 参数以及解析的选项和非选项参数的访问,如下所示:
```
@Component
public class MyBean {
public MyBean(ApplicationArguments args) {
boolean debug = args.containsOption("debug");
List<String> files = args.getNonOptionArgs();
if (debug) {
System.out.println(files);
}
// if run with "--debug logfile.txt" prints ["logfile.txt"]
}
}
```
提示: Spring Boot 还向 Spring Environment 注册了一个 CommandLinePropertySource。 所以可以使用 @Value 注释注入单个应用程序参数。
## 10. ApplicationRunner 和 CommandLineRunner 的使用
如果需要在 SpringApplication 启动后运行某些特定代码,可以实现 ApplicationRunner 或 CommandLineRunner 接口。 这两个接口的工作方式相同,并提供一个 run 方法,该方法在 SpringApplication.run(... ) 完成之前调用。
注意: 该方式非常适合应在应用程序启动之后但在开始接受流量之前运行的任务。
CommandLineRunner 接口提供对作为字符串数组的应用程序参数的访问,而 ApplicationRunner 使用 ApplicationArguments 接口。 以下示例显示了一个带有 run 方法的 CommandLineRunner:
```
@Component
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) {
// Do something...
}
}
```
如果定义了多个必须按特定顺序调用的 CommandLineRunner 或 ApplicationRunner bean,则可以另外实现 org.springframework.core.Ordered 接口或使用 org.springframework.core.annotation.Order 注释。
## 11. 应用的退出
每个 SpringApplication 向 JVM 注册一个关闭钩子,以确保 ApplicationContext 在退出时正常关闭。 可以使用所有标准的 Spring 生命周期回调(例如 DisposableBean 接口或 @PreDestroy 注释)。
此外,如果 bean 希望在调用 SpringApplication.exit() 时返回特定的退出代码,它们可以实现 org.springframework.boot.ExitCodeGenerator 接口。 然后可以将此退出代码传递给 System.exit() 以将其作为状态代码返回,如以下示例所示:
```
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() 方法提供的退出代码。
## 12. 管理功能
通过指定` spring.application.admin.enabled `属性为应用程序启用与管理相关的功能。这将在平台 MBeanServer 上公开 SpringApplicationAdminMXBean。 可以使用此功能远程管理您的 Spring Boot 应用程序。 此功能也可用于任何服务包装器实现。
提示: 如果想知道应用程序在哪个 HTTP 端口上运行,使用 local.server.port 键获取属性。
## 13. 应用程序启动跟踪
在应用程序启动过程中,SpringApplication 和 ApplicationContext 执行许多与应用程序生命周期、bean 生命周期甚至处理应用程序事件相关的任务。 通过 ApplicationStartup,Spring Framework 允许您使用 StartupStep 对象跟踪应用程序启动顺序。 可以收集这些数据用于分析目的,或者只是为了更好地了解应用程序启动过程。
可以在设置 SpringApplication 实例时选择 ApplicationStartup 实现。 例如,要使用 BufferingApplicationStartup,可以编写:
```
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
}
}
```
第一个可用的实现 FlightRecorderApplicationStartup 由 Spring Framework 提供。 它将特定于 Spring 的启动事件添加到 Java Flight Recorder 会话中,用于分析应用程序并将其 Spring 上下文生命周期与 JVM 事件(例如分配、GC、类加载......)相关联。 配置完成后,可以通过在启用Flight记录器的情况下运行应用程序来记录数据:
```
$ java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar demo.jar
```
Spring Boot 附带了 BufferingApplicationStartup 变体; 此实现旨在缓冲启动步骤并将它们排入外部指标系统。 应用程序可以在任何组件中请求类型为 BufferingApplicationStartup 的 bean。
Spring Boot 还可以配置为公开一个启动端点,该端点以 JSON 文档的形式提供此信息。
*****
*****
如果您希望自动注册这些侦听器,无论应用程序的创建方式如何,您都可以将 META-INF/spring.factories 文件添加到您的项目中,并使用 org.springframework.context 引用您的侦听器。 ApplicationListener 键,如下例所示:
也可以添加 META-INF/spring.factories 文件。 使用如下方式注册:
```
org.springframework.context.ApplicationListener=com.example.project.MyListener
```
应用的事件是有顺序的:
* 在实际开发中, 应用的事件一般较少使用
*
| | |
| --- | --- |
| addInitializers()| |
| addListeners | |
| addPrimarySources | |
| setAddCommandLineProperties | |
| setAddConversionService | |
| setAdditionalProfiles | |
| setAllowBeanDefinitionOverriding | |
| setBanner | |
| setBannerMode | |
| setDefaultProperties | |
| setEnvironment | |
| setHeadless | |
| setLazyInitialization | |
| setLogStartupInfo | |
| setWebApplicationType | |
| ... | |
具体参考:
https://docs.spring.io/spring-boot/docs/2.5.5/api/org/springframework/boot/SpringApplication.html
* 使用 Kubernetes Probes , 使用actuator
* 继承 ApplicationAvailability 接口
1. 活动状态(Liveness State), 内部状况,不依赖外部检查
2. 准备状态(Readiness State),运行之后进入该状态
3. 管理应用的可用状态
可以将应用的准备状态到处到文件, Kubernetes 的 “exec Probe” 就可以使用这个文件。
应用中断无法恢复时,可以更新应用的状态:
Spring Boot提供了 Kubernetes 的HTTPS 探测器来探测 Liveness和Readiness 状态。可以参考:
https://docs.spring.io/spring-boot/docs/current/reference/html/deployment.html#deployment.cloud.kubernetes
- 前言
- 1. 基础篇
- Spring Boot 介绍
- 如何创建Spring Boot项目
- Spring Boot基本使用
- 1. 系统构建
- 2. 代码结构和开发
- 项目配置
- 配置文件
- pom.xml 配置说明
- 测试
- 测试介绍
- 测试注解
- 常见问题及解决
- Spring Boot测试示例
- Spring Boot Test 进行JPA 测试保存数据到数据库
- 常见开发类
- Web
- HttpEntity
- CommandLineRunner
- 开发IDE
- Eclipse开发设置
- 开发知识点
- 项目相关路径与资源获取
- 2. 数据篇
- Spring操作数据库的方式汇总
- Spring Data JPA
- Spring Boot操作数据库的方式
- Spring Boot+JPA CriteriaBuilder查询
- Spring Boot+JPA 有查询条件的查询
- CriteriaBuilder转sql语句
- DAO
- Spring Boot+JPA 查询数据方式与代码演示
- Spring JPA 接口和类
- CrudRepository
- JPA Native Query(原生查询)的缓存问题
- Eclipse下安装EclipseLink进行JPA开发
- Eclipse Link or Hibernate
- 配置参考
- Spring Boot多数据源配置
- 错误解决
- ORA-00932: inconsistent datatypes: expected - got CLOB
- hibernate in 的list 大小不能超过1000
- java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type
- ava.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [XXX]
- JPA 基础
- Spring Jdbc 实现 Clob/Blob 类型字段的插入
- JPA Native Query(本地查询)及查询结果转换
- JPA如何查询部分字段
- JPA 主键策略
- JPA+EclipseLink+Oralce 通过GenerationType.AUTO 实现自增长字段
- JPA的persist() 和 merge() 方法的区别
- 关联
- 批量更新
- JPA重要知识点
- JPA中实体的状态
- 数据库操作技术
- JPA二级缓存
- JPA3
- 分页查询
- Spring Boot+JPA 事务
- Spring Boot 数据源
- Spring Boot 3 整合 H2 快速示例
- Spring Boot+JPA+Oralce 配置
- Spring Boot+JPA不同类型数据库的多数据源配置
- Spring Data JPA + Oracle
- Spring Boot + Oracle 处理Blob/Clob类型字段实例
- Spring Boot+JPA+Oracle Clob 类型字段查询处理
- Spring Boot + JPA + Oracle 自增长字段实现示例
- 内存数据库H2+Spring Boot
- 3. 实战篇
- 项目创建和管理
- 基于Maven创建多模块的Spring Boot项目
- 最佳实践
- REST —Java对象的字符串属性值转换为JSON对象的布尔类型值
- Spring Boot 项目中Java对象的字符串类型属性值转换为JSON对象的布尔类型键值的解决方法及过程
- [在线API]Spring Boot+springfox-swagger2 之RESTful API自动生成和测试
- Spring Boot与JWT整合实现前后端分离的用户认证之一
- 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之一
- 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之二
- SpringBoot应用中JSP的角色及整合
- Spring Boot项目中使用JSP实例
- Spring Boot 文件上传功能实现与简单示例
- Spring Boot+CKEditor 实现编辑器中的图片上传
- 开发注意事项
- 部署与维护
- SpringBoot项目在Gitee的控管步骤
- JSP如何获取Spring Boot的配置属性
- 错误页面处理
- JPA相关
- Spring Boot + JPA 表和类的对应处理
- Spring Boot + JPA +MySQL 数据操作及示例环境搭建(手动建表)
- Spring Boot + JPA +MySQL 数据操作及示例环境搭建(自动建表)
- 基于Spring Boot + JPA +MySQL的JPA关联查询ManyToOne示例
- JPA的单向一对多关联(oneToMany)实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- JPA的双向一对多关联(oneToMany)实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- JPA的双向一对一关联实现示例(基于Spring Boot + JPA +MySQL,表自动维护)
- 一次使用JUnit + JPA 实现数据Migrate的实例介绍
- Spring Boot整合H2内存数据库配置及常见问题处理
- Spring Boot + Spring Data JPA 实现数据库操作的标准示例
- REST
- Spring Boot 访问HTTPS的url
- Spring Boot集成Log4j2
- Spring Boot + Ext JS 安全
- Spring Boot Web
- 内置服务器
- Spring Boot 中Filter的定义方式
- 开发工具
- Spring 开发利器之——Spring Tools 4
- Spring OAuth2+Basic
- Spring 缓存
- 快速实例
- Spring Security实战
- Spring Boot OAuth2 快速入门示例
- Spring Boot 项目使用Spring Security防护CSRF攻击实战
- Spring Boot OAuth2 认证服务器搭建及授权码认证演示
- 基于Spring OAuth2 之客户端凭证模式演示
- 基于Spring OAuth2 之简化模式演示
- 密码模式
- 客户端凭证
- 设置JWT Claim
- Client 数据库配置
- Spring Boot+Security 实现Basic认证
- Spring Boot + WebLogic 12c 之Basic认证
- spring-security-oauth2-authorization-server
- 4. 专题篇
- 项目与属性配置
- 外部化程序的配置
- 服务配置
- 不使用spring-boot-starter-parent作为Parent
- 数据库配置
- Spring Boot 2.7.14+Oracle 11+WebLogic
- Spring Boot+Vaadin
- Spring Boot+Vaadin 14项目初始化
- Vaadin 导入JS和添加JS代码段
- 常见及疑难问题解决
- Could not find artifact org.vaadin.artur:a-vaadin-helper:jar:1.6.2
- Spring Boot+Activiti
- Spring Boot + Activiti 工作流框架搭建
- Activiti 知识
- Spring Boot+Activiti开发注意点
- Activiti 代码
- Spring Boot缓存
- Spring Boot Cache
- Spring Boot整合Redis快速入门实例
- 配置 JSON 序列器
- 错误解决篇
- Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
- Spring Root+Cache+Redis 实战
- Spring Boot+Redis 实现分布式缓存
- Spring Cloud + Redis 配置
- 主要类和方法
- 使用方式
- 缓存配置
- Redis Cache
- 缓存注解
- 类配置
- Spring Cloud
- 微服务架构
- 快速了解Spring Cloud
- Spring Cloud Eureka 最简入门示例
- Spring Cloud Ribbon 负载均衡客户端调用示例
- Spring Cloud Eureka注册服务器集群配置
- Spring Cloud常见问题及解决
- Spring Cloud Eureka Server的部署与启动
- 配置中心
- Spring Boot+HATEOAS
- HATEOAS概念
- Spring Boot+HATEOAS快速介绍与示例
- 开发说明
- Spring 安全
- Spring 框架RCE 安全漏洞
- Spring RCE 漏洞 CVE-2022-22965 的终极解决方案
- Spring Boot 跨域访问实现方式
- 轻量级网关-反向代理
- Spring Security
- 基本使用
- 主要问题
- securityChain
- UserDetailsService
- 忽略请求URL
- 安全
- Spring Boot项目CSRF (跨站请求伪造)攻击演示与防御
- Spring Boot CSRF 防御+Coverity
- 认证管理器-AuthenticationManager
- Spring Security开发介绍
- Spring Security 快速入门
- Spring Security 依赖导入
- Spring Security 用户认证
- Spring CSRF 实现机制
- 实战示例
- 入门示例
- Spring Security 常见问题
- Caused by: java.lang.IllegalArgumentException: realmName must be specified
- 总是报403错误
- Spring访问http/https
- Spring RestTemplate 访问https站点
- Spring Boot RestTemplate 忽略证书访问https
- Spring Boot OAuth2 Client -客户端模式 client credentials 获取token
- OAuth2RestTemplate
- Spring Security OAuth 访问OAuth2.0 的https站点
- Spring RestTemplate 忽略证书访问https的OAuth2 认证站点
- Spring OAuth 2.0
- 授权服务器和资源服务器
- Spring 对 OAuth2.0的解决方案
- OAuth2 认证服务器
- jjwt+oauth
- Spring OAuth2 的认证
- Spring Boot实现访问接口的Basic认证
- CORS
- Access-Control-Allow-Credentials
- Java JWT
- JWT
- 声明-subject
- 安全基本知识
- BCrypt
- Spring LDAP
- Spring Boot LDAP 认证
- LDAP问题与解决
- javax.naming.PartialResultException: Unprocessed Continuation Reference(s);
- Spring IO
- 接口和类
- Resource
- 性能
- Web缓存
- Spring Web
- 如何添加Filter
- OncePerRequestFilter
- 得到请求地址和参数
- 应用上下文路径
- 5. 开发参考
- 注解
- WebMvcAutoConfiguration
- JPA
- 如何加载 jar 中的注解类
- 1
- @EnableAsync
- 6. 常见问题
- bean named 'entityManagerFactory' that could not be found错误及解决
- invalid LOC header错误及解决
- No identifier specified for entity:
- Optional int parameter 'id' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
- Could not resolve view with name 'xxxx' in servlet with name 'dispatcherServlet'
- JSON parse error: Unrecognized field
- multipart/form-data;boundary=----WebKitFormBoundaryRAYPKeHKTYSNdzc1;charset=UTF-8' not supported
- 跨域 Access to XMLHttpRequest at ' xxxxx' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
- maven 下载问题
- Maven 无法下载Oracle 驱动解决
- Spring Boot常见面试题
- Spring Boot 访问JSP主页面出现下载页面
- Spring Boot 面试题大全
- Spring Cloud相关问题
- java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://eurekaclient_service/
- Spring JPA
- Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set。
- 同时排序和分页查询的数据不对
- No EntityManager with actual transaction available for current thread
- should be mapped with insert="false" update="false"
- java.lang.IllegalArgumentException: Not a managed type:XX
- java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: XX is not mapped
- org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- org.hibernate.LazyInitializationException: could not initialize proxy xxx - no Session
- [EclipseLink]The attribute [xxx] of class [xxx] is mapped to a primary key column in the database. Updates are not allowed.
- cannot simultaneously fetch multiple bags
- Spring Boot + Hibernate java.lang.IllegalArgumentException: Not an entity: class
- mvn spring-boot class file for javax.interceptor.InterceptorBinding not found
- sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
- Spring Boot返回的数据格式是XML 而不是JSON之原因探求的和解决
- Failed to parse multipart servlet request; nested exception is javax.servlet.ServletException: The request content-type is not a multipart/form-data
- WebSecurityConfigurerAdapter 过时及替代写法
- consider increasing the maximum size of the cache
- java.lang.ClassCastException: org.springframework.context.annotation.AnnotationConfigApplicationContext cannot be cast to org.springframework.web.context.WebApplicationContext
- org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet
- Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet
- Spring Boot测试无法运行问题解决(注入的组件为空)
- web.xml is missing and <failOnMissingWebXml> is set to true
- no main manifest attribute
- Refused to display 'http://localhost:8080/' in a frame because it set 'X-Frame-Options' to 'deny'.
- 问题模板
- Spring Security问题
- WebSecurityConfigurerAdapter过期了
- @EnableAuthorizationServer 已经废弃
- com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [map type; class java.util.Map, [simple type, class java.lang.String] -> [simple type, class java.lang.Object]]: missing type id property '@class'
- Spring Web问题
- I/O error while reading input message; nested exception is java.io.IOException: Stream closed
- Filter读取JSON参数之后, Spring无法自动封装
- 部署到 WebLogic的问题
- 如何导入其他jar 的组件
- 类型转换
- JSON 格式转换
- Spring开发问题之org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class
- 7. 官方文档翻译篇
- Spring Framework参考文档-V6.0.8
- 总览
- 核心
- 测试-
- 数据访问
- Web Servlet
- Web Reactive
- 整合
- 1. REST 客户端
- 2.JMS(Java消息服务)
- 3. JMX
- 4. 邮件
- 5. 任务执行与排程
- 6. 缓存抽象
- 7. 监控支持
- 语言
- Spring Boot核心功能
- 1. SpringApplication 启动引导类
- 2. 属性配置
- 2.8 类型安全的属性配置
- 3. Profile
- 4. 日志
- 5. 国际化
- 6. JSON
- 7. 任务执行和计划
- 8. 测试
- 8.1 测试范围依赖
- 8.2 测试Spring应用
- 8.3 测试Spring Boot应用
- 8.3.1 侦测Web应用的类型
- 8.3.2 侦测测试配置
- 8.3.3 排除测试配置
- 8.3.4 使用应用的参数
- 8.3.5 使用模拟环境测试
- 8.3.6 使用服务器进行测试
- 8.3.7 自定义WebTestClient
- 8.3.8 使用JMX
- 8.3.9 使用Metrics
- 8.3.10 模拟和窥探Beans
- 8.3.11 自动配置的测试
- 8.3.12 自动配置的JSON测试
- 8.3.13 Spring MVC测试的自动配置
- 8.3.14 Spring WebFlux 测试的自动配置
- 8.3.15 Cassandra 测试的自动配置
- 8.3.16 数据 JPA 测试的自动配置
- 8.4 测试工具类
- 9. 定制属于你的自动配置
- 9.1 了解自动配置的Beans
- 9.2 定位自动配置的候选者
- 9.3 条件注释
- 10. Kotlin 支持
- Spring Boot 其他功能
- 7. Web 应用的开发
- Spring MVC 框架
- Spring WebFlux 框架
- JAX-RS 和Jersey
- 内置 Servlet 容器支持
- 内置响应式服务器支持
- 响应式服务器资源配置
- 8. 优雅关闭
- 9. RSocket
- 10. 安全
- 11. 使用SQL 数据库
- 11.2 JdbcTemplate 的使用
- 12. NoSQL技术
- 13. 缓存
- 14. 消息
- 15. 使用RestTemplate调用REST服务
- 16. 使用WebClient调用REST服务
- 17. 验证
- 18. 发送邮件
- 19. 使用JTA实现分布式事务
- 20. 分布式内存-Hazelcast
- 21. 定时器Quartz Scheduler
- 22. 任务执行和计划
- 23. Spring 整合
- 24. Spring 会话
- 25. 使用JMX 监控和管理
- 26. Testing 测试
- 27. WebSockets
- 28. Web Services
- 29. 创建自动配置
- 30. 对Kotlin 的支持
- 31. 容器
- Spring Boot开发指南 V3.1
- 入门
- Spring Boot应用升级
- 如何使用Spring Boot进行开发
- 核心功能
- Web-
- Data-数据
- IO
- 缓存
- 消息
- 容器
- 生产就绪功能
- 部署
- GraalVM Native Image Support
- Spring Boot命令行
- 构建工具插件
- 1. Spring Boot 应用
- 1.1 自定义错误分析器
- 1.2 自动配置的故障排除
- 1.3 启动之前自定义环境(Environment)和应用上下文(ApplicationContext)
- Spring Data Redis -Version 3.0.5
- 前言
- Spring Redis 开发参考文档
- 响应式 Redis 支持
- Redis集群
- Redis存储库
- Spring Security
- 参考
- Spring Authorization Server-0.4.2
- 概括
- 帮助
- Spring认证服务入门
- Spring Authorization Server-0.4.3
- 协议端点(Protocol Endpoints)
- OAuth2 授权端点
- 核心模型组件
- OAuth2TokenCustomizer
- 关联知识
- JWK Set
- 默认端点
- JWT JWK
- OpenID Connect 1.0
- OAuth2
- 问题
- [invalid_request] OAuth 2.0 Parameter: redirect_uri
- [invalid_request] OAuth 2.0 Parameter: state
- There is no PasswordEncoder mapped for the id "null"
- 实际开发
- 8. 补充篇
- Jackson
- 资源
- 配置大全
- Spring Boot 与 Java 版本对应
- Java Web
- 如何在Filter中读取JSON 类型的参数