springboot 应用概览
SpringApplication
类以main()
方法作为入口, 提供了非常方便的方式来启动Spring应用程序。大多数情况下直接调用静态方法SpringApplication.run
就可以搞定:
1 | public static void main(String[] args) { |
应用启动时输出信息类似:
1 | . ____ _ __ _ _ |
默认输出INFO
级别日志,包括一些启动相关的细节、启动应用的用户等。 设置spring.main.log-startup-info
为false
可以关闭启动日志,包含当前生效的profile日志。
如果想输出其它内容, 可以继承SpringApplication
类重写logStartupInfo(boolean)
方法。
启动失败
如果应用启动失败,注册的FailureAnalyzers
会有机会执行并提供专用的错误信息和显示如何修复问题的操作描述。例如8080
端口被占用导致启动失败的话, 会看到如下信息:
1 | *************************** |
提示:spring 提供了几种FailureAnalyzer
实现,也可以添加自定义实现。
延迟初始化
SpringApplication
支持延迟初始化, 开启延迟初始化后,组件并不会在应用启动时就创建,要用到的时候才会创建。延迟初始化可以减少启动时间。在web应用里, 很多web相关的组件要有HTTP 请求进来的时候才会初始化, 这可能影响请求响应时间。
延迟启动的弱点,是会延迟问题显露的时间。 一些错误配置的延迟初始化组件在启动时并不会暴露问题,直到它用到的时候问题的会暴露。而且还需要考虑JVM有足够的内存来容纳所有的组件, 不仅仅是启动时初始化的组件。基于这些原因,延迟初始化默认是关闭的。开启延迟初始化前,一定先优化好内存配置。
延迟初始化可用编程方式开启, 可以调用SpringApplicationBuilder
的lazyInitialization
方法,或者SpringApplication
的setLazyInitialization
方法。 另外还可能通过spring.main.lazy-initialization
属性开启。
1 | 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 | public static void main(String[] args) { |
提示:
SpringApplication
的构造函数参数是Spring Beans的配置源,大多数时候是有@Configuration注解的类,当然也可以是XML配置文件的引用, 或者需要扫描的包路径
还可以用application.properties
配置SpringApplication
,详情见*Externalized Configuration*
SpringApplication
流式构建api
如果想创建一个有层次结构的ApplicationContext
(有父子关系的多上下文),或者更愿意使用流式构建api,那么可以使用SpringApplicationBuilder
。
SpringApplicationBuilder
让你能够链式的操作多个方法,其中parent
和child
让你能够构建上下文的层次结构,如:
1 | new SpringApplicationBuilder() |
提示: 创建上下文层次结构有一些限制,例如Web组件必须包含在子上下文里,而且父子上下文使用的是相同的
Environment
,更多细节参考SpringApplicationBuilder
Javadoc
应用可用性
在平台上部署后,应用程序可以使用诸如Kubernetes Probes之类的底层技术向平台提供可用性相关的信息。Spring Boot对常用的“存活性”和“就绪性”可用性状态提供了开箱即用的支持。如果使用Spring boot actuator
模块支持,那么这个些状态将显示为运行状态端点组(google翻译,不知道什么意思。。。)
另外,你还可以通过注入ApplicationAvailability
接口到自己的bean里,来实现其可用性监控。