springboot 应用概览

SpringApplication 类以main() 方法作为入口, 提供了非常方便的方式来启动Spring应用程序。大多数情况下直接调用静态方法SpringApplication.run就可以搞定:

1
2
3
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}

应用启动时输出信息类似:

1
2
3
4
5
6
7
8
9
10
11
12
  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: v2.4.0

2019-04-31 13:09:54.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
2019-04-31 13:09:54.166 INFO 56603 --- [ main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2019-04-01 13:09:56.912 INFO 41370 --- [ main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
2019-04-01 13:09:57.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)

默认输出INFO级别日志,包括一些启动相关的细节、启动应用的用户等。 设置spring.main.log-startup-infofalse可以关闭启动日志,包含当前生效的profile日志。

如果想输出其它内容, 可以继承SpringApplication类重写logStartupInfo(boolean)方法。

启动失败

如果应用启动失败,注册的FailureAnalyzers 会有机会执行并提供专用的错误信息和显示如何修复问题的操作描述。例如8080端口被占用导致启动失败的话, 会看到如下信息:

1
2
3
4
5
6
7
8
***************************
APPLICATION FAILED TO START
***************************
Description:
Embedded servlet container 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 提供了几种FailureAnalyzer实现,也可以添加自定义实现

延迟初始化

SpringApplication 支持延迟初始化, 开启延迟初始化后,组件并不会在应用启动时就创建,要用到的时候才会创建。延迟初始化可以减少启动时间。在web应用里, 很多web相关的组件要有HTTP 请求进来的时候才会初始化, 这可能影响请求响应时间。

延迟启动的弱点,是会延迟问题显露的时间。 一些错误配置的延迟初始化组件在启动时并不会暴露问题,直到它用到的时候问题的会暴露。而且还需要考虑JVM有足够的内存来容纳所有的组件, 不仅仅是启动时初始化的组件。基于这些原因,延迟初始化默认是关闭的。开启延迟初始化前,一定先优化好内存配置。

延迟初始化可用编程方式开启, 可以调用SpringApplicationBuilderlazyInitialization方法,或者SpringApplicationsetLazyInitialization方法。 另外还可能通过spring.main.lazy-initialization属性开启。

1
2
3
4
spring.main.lazy-initialization=true
spring:
main:
lazy-initialization: true

自定义Banner

应用启动时打印的Banner是可以修改的:

  • classpath 下添加一个banner.txt 文件
  • 设置spring.banner.location 属性指向banner文件

如果banner文件的编码不是UTF8,那么可以设置spring.banner.charset属性来指定些文件的编码。

banner文件除了文件文件,还可以在classpath下放banner.gif, banner.jpg, banner.png 图片文件,也可能用spring.banner.image.location 属性指定图片位置。

banner.txt 里可以使用占位符,可用的占位符如下:

变量 描述
${application.version} 应用版本编号,定义在 MANIFEST.MF文件里. 例如 Implementation-Version: 1.0 打印为1.0.
${application.formatted-version} 格式化输出的版本号,如:(v1.0)
${spring-boot.version} 使用的spring boot 版本,如:2.4.0
${spring-boot.formatted-version} 格式化输出的使用的spring boot 版本,如:(v2.4.0)
${Ansi.NAME} (or ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME}) NAME是ANSI 转义字符的名称,详情参考: AnsiPropertySource
${application.title} 应用名称,定义在MANIFEST.MF文件里,例如:Implementation-Title: MyApp ,展示为:MyApp

提示: MANIFEST.MF 文件不需要自己写, 这是打包时spring boot maven插件生成的。假如是maven项目的话,里面的版本和title,是自于pom文件的。开发时展示不出来。这个文件是用户来java标准里用来描述jar包的。

定制SpringApplication

如果默认的SpringApplication 不满足你的味口,那么可以创建一个局部实例,然后定制它。 例如关闭banner:

1
2
3
4
5
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}

提示: SpringApplication的构造函数参数是Spring Beans的配置源,大多数时候是有@Configuration注解的类,当然也可以是XML配置文件的引用, 或者需要扫描的包路径

还可以用application.properties 配置SpringApplication,详情见*Externalized Configuration*

SpringApplication 流式构建api

如果想创建一个有层次结构的ApplicationContext(有父子关系的多上下文),或者更愿意使用流式构建api,那么可以使用SpringApplicationBuilder

SpringApplicationBuilder让你能够链式的操作多个方法,其中parentchild让你能够构建上下文的层次结构,如:

1
2
3
4
5
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);

提示: 创建上下文层次结构有一些限制,例如Web组件必须包含在子上下文里,而且父子上下文使用的是相同的Environment,更多细节参考SpringApplicationBuilder Javadoc

应用可用性

在平台上部署后,应用程序可以使用诸如Kubernetes Probes之类的底层技术向平台提供可用性相关的信息。Spring Boot对常用的“存活性”和“就绪性”可用性状态提供了开箱即用的支持。如果使用Spring boot actuator 模块支持,那么这个些状态将显示为运行状态端点组(google翻译,不知道什么意思。。。)

另外,你还可以通过注入ApplicationAvailability接口到自己的bean里,来实现其可用性监控。

Liveness State