SpringBoot官方文档学习(一)SpringApplication
Springboot通过main方法启动,在许多情况下,委派给静态SpringApplication.run方法:
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}
启动后,输出的内容:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: v2.2.2.RELEASE 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日志级别。也可以在application.properties文件中配置你想要的日志级别:
logging.level.root=warn logging.level.org.springframework.web=debug logging.level.org.hibernate=error
如果想关闭启动日志的话,可以配置:spring.main.log-startup-info=false。
注:要在启动期间添加其他日志记录,可以覆盖SpringApplication类的logStartupInfo(boolean)方法。
1.启动失败
如果应用启动失败,注册FailureAnalyzers将会给你展示有用的错误信息和提供给你一些解决问题有效的措施。例如端口被占用时,将会展示以下的一些信息:
***************************
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 Boot提供许多FailureAnalyzer实现,我们也可以添加我们自己的实现。
例如:
扩展AbstractFailureAnalyzer抽象类
,FailureAnalyzer的实现主要是
检查要处理的异常中是否存在指定的异常类型。您也可以对FailureAnalyzer接口进行扩展,以便您的实现只有在异常出现时才有机会处理该异常。如果由于某种原因无法处理该异常,请返回null
以使另一个实现有机会处理该异常。
FailureAnalyzer
实现必须在META-INF/spring.factories中注册
。以下示例注册ProjectConstraintViolationFailureAnalyzer
org.springframework.boot.diagnostics.FailureAnalyzer=\
com.example.ProjectConstraintViolationFailureAnalyzer //自定义的实现
注:如果需要访问BeanFactory
或Environment
,则实现FailureAnalyzer的同时,
可以分别实现BeanFactoryAware
或EnvironmentAware.
如果没有故障分析器能够处理该异常,我们应该尽可能显示详细的、完整的情况报告来帮助我们判断问题和解决问题。因此,我们需要开启debug参数或为org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener开启debug日志。
使用java -jar启动应用时,我们可以通过以下发送来开启debug参数(命令行):
java -jar myApp-0.0.1-SNAPSHOT.jar --debug
2.延迟初始化
如果SpringApplication允许使用延迟初始化,那么Beans将在app初始化完成之后加载。 可以缩减app启动时间。如果是web应用,当有http请求到来时,与该请求相关的beans才会初始化。
优点:缩减app启动时间
缺点:
a.如果错误配置的Bean延迟初始化,启动期间不会发生故障, 会在初始化Bean的时候问题才出现。
b.必须注意和确保JVM有足够的内存来容纳所有应用程序的bean。
默认不会启动延迟初始化,若要启动该功能,建议先对JVM的堆大小进行适当的调整。
启动延迟初始化的三种方法:
a.SpringApplicationBuilder类的lazyInitialization
方法
b.SpringApplication类的setLazyInitialization
方法
c.设置spring.main.lazy-initialization=true
注:a和b的方法在springboot新版本可以设置,老版本例如1.5.5没有。
如果想对部分应用禁用bean的延迟初始化,可以使用@Lazy(false).
3.自定义横幅(Banner)
自定义横幅有两种方式:
a.将banner.txt文件添加到类路径下
b. spring.banner.location
属性设置为此文件的位置
注:如果文件编码格式不是UTF-8,可以设置spring.banner.charset配置。除了文本文件,还可以添加banner.gif、banner.jpg
或banner.png
图像文件。图像将转换为ASCII艺术作品并打印在任何文字横幅上方。
在banner.txt
文件内部,可以使用以下任意占位符:
变量 | 描述 |
---|---|
|
您的应用程序的版本号,如中所述 |
|
您的应用程序的版本号,已声明 |
|
您正在使用的Spring Boot版本。例如 |
|
您正在使用的Spring Boot版本,其格式用于显示(用括号括起来,并带有前缀 |
|
|
|
您的应用程序的标题,如中所述 |
注:如果想以编码方式生成横幅,可以使用SpringApplication.setBanner(…)方法。使用org.springframework.boot.Banner接口并实现自己的printBanner(...)方法。
也可以使用spring.main.banner-mode配置来确定是否打印到控制台或日志中或不打印。OFF:不打印 CONSOLE:输出打印到控制台 LOG:打印到日志
打印的banner将被注册为一个名为springBootBanner的singleton bean。
4.自定义SpringApplication
我们可以创建一个本地实例并对其进行自定义。例如关闭横幅:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
}
注:传递给构造函数的参数SpringApplication
是Spring bean的配置源。在大多数情况下,这些是对@Configuration
类的引用,但它们也可以是对XML配置或应扫描的程序包的引用。
我们可以通过使用application.properties文件来配置SpringApplication。 具体的外部化配置请参考后面的介绍《SpringBoot学习(二)Externalized Configuration(外部化配置)》。
完整的配置选项:参考javadoc文档 https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/api//org/springframework/boot/SpringApplication.html
5.Fluent Builder API(流利的构建器api)
如果您需要构建ApplicationContext
层次结构(具有父/子关系的多个上下文),或者您更喜欢使用“流利的”构建器API,则可以使用SpringApplicationBuilder
。
在SpringApplicationBuilder
让要链接的多个方法调用,并且包括parent
和child
其让你创建层次结构,以显示在下面的示例性方法:
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
注:创建ApplicationContext层次结构时有一些限制。例如:web组件必须包含在子上下文中,并且Environment父和子上下文都使用相同的组件。完整的信息参考:SpringApplicationBuilder Javadoc。
https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/api//org/springframework/boot/builder/SpringApplicationBuilder.html
6.应用程序事件和监听器
除了通常的Spring Framework事件(例如)外ContextRefreshedEvent
,SpringApplication
还会发送一些其他应用程序事件。
有些事件实际上是在ApplicationContext
创建之前触发的,因此您无法将其注册为@Bean
。您可以使用SpringApplication.addListeners(…)
方法或SpringApplicationBuilder.listeners(…)
方法注册它们。
如果您希望这些侦听器自动注册,而不管创建应用程序的方式如何,都可以将META-INF/spring.factories
文件添加到项目中,并使用org.springframework.context.ApplicationListener
键引用您的侦听器,如以下示例所示:
org.springframework.context.ApplicationListener = com.example.project.MyListener
应用程序事件在您的应用程序运行时按以下顺序发送:
在运行开始时,一个ApplicationStartingEvent将在进行任何处理之前(侦听器和初始化程序的注册除外)发送。
一个
ApplicationEnvironmentPreparedEvent
当被发送Environment
到中已知的上下文中使用,但是在创建上下文之前。准备ApplicationContext并调用ApplicationContextInitializers之后但在加载任何bean定义之前,将发送ApplicationContextInitializedEvent。
ApplicationPreparedEvent
在刷新开始之前但在加载bean定义之后发送 。一个
ApplicationStartedEvent
上下文已被刷新后发送,但是任何应用程序和命令行亚军都被调用前。的
ApplicationReadyEvent
任何应用程序和命令行亚军被呼叫后发送。它指示该应用程序已准备就绪,可以处理请求。一个
ApplicationFailedEvent
如果在启动时异常发送。
上面的列表仅包含SpringApplicationEvent
与绑定的SpringApplication
。除这些以外,以下事件也在之后ApplicationPreparedEvent
和之前发布ApplicationStartedEvent
:
ApplicationContext被刷新后,
ContextRefreshedEvent将被发送。
WebServer准备就绪后,
WebServerInitializedEvent将被发送
。WebServer
ServletWebServerInitializedEvent
和ReactiveWebServerInitializedEvent
分别是servlet和反应式变量。
注:您通常不需要使用应用程序事件,但是很容易知道它们的存在。 在内部,Spring Boot使用事件来处理各种任务。
7.Web Environment
一个SpringApplication
试图创建正确类型的ApplicationContext
代表您。确定WebApplicationType的算法
非常简单:
如果存在Spring MVC,
AnnotationConfigServletWebServerApplicationContext
则使用如果不存在Spring MVC但存在Spring WebFlux,
AnnotationConfigReactiveWebServerApplicationContext
则使用否则,
AnnotationConfigApplicationContext
使用
这意味着,如果您WebClient
在同一应用程序中使用Spring MVC和Spring WebFlux中的新功能,则默认情况下将使用Spring MVC。您可以通过调用setWebApplicationType(WebApplicationType)轻松覆盖它。
也可以在使用ApplicationContext时通过调用setApplicationContextClass(…)来实现完全控制。
注:当在JUnit测试中使用SpringApplication时,它经常被描述为setWebApplicationType(WebApplicationType.NONE)。
8.访问应用程序参数
如果您需要访问传递给的应用程序参数,则SpringApplication.run(…)
可以注入org.springframework.boot.ApplicationArguments
Bean。该ApplicationArguments
接口提供对原始String[]
参数以及已解析option
和non-option
参数的访问,如以下示例所示:
import org.springframework.boot.*;
import org.springframework.beans.factory.annotation.*;
import org.springframework.stereotype.*; @Component
public class MyBean { @Autowired
public MyBean(ApplicationArguments args) {
boolean debug = args.containsOption("debug");
List<String> files = args.getNonOptionArgs();
// if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
} }
注:Spring Boot也登记一个CommandLinePropertySource到Spring Environment。这将让你可以通过使用@Value来注入单个应用程序参数。
9.使用ApplicationRunner或CommandLineRunner
SpringApplication被启动时,你想要运行一些特定的代码时,
则可以实现ApplicationRunner
或CommandLineRunner
接口。这两个接口以相同的方式工作,并提供一个单一的run
方法,该方法在SpringApplication.run(…)
完成之前就被调用。
CommandLineRunner
接口提供访问的应用程序的参数作为一个简单的字符串数组,而ApplicationRunner
用途ApplicationArguments
接口前面讨论。以下示例显示了一个CommandLineRunner
with run
方法:
import org.springframework.boot.*;
import org.springframework.stereotype.*; @Component
public class MyBean implements CommandLineRunner { public void run(String... args) {
// Do something...
} }
如果几个CommandLineRunner
或ApplicationRunner beans
定义必须以一个特定的顺序被调用,您还可以实现org.springframework.core.Ordered
接口或使用org.springframework.core.annotation.Order
注解。
10.应用退出
每个都SpringApplication
向JVM注册一个关闭钩子,以确保ApplicationContext
退出时正常关闭。可以使用所有标准的Spring生命周期回调(例如DisposableBean
接口或@PreDestroy
批注)。
另外,org.springframework.boot.ExitCodeGenerator
如果bean 希望在SpringApplication.exit()
调用时返回特定的退出代码,则可以实现该接口。然后可以将此退出代码传递给System.exit()
它,以将其作为状态代码返回,如以下示例所示:
@SpringBootApplication
public class ExitCodeApplication { @Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
} public static void main(String[] args) {
System.exit(SpringApplication.exit(SpringApplication.run(ExitCodeApplication.class, args)));
} }
而且,该ExitCodeGenerator
接口可以被异常类实现。当遇到这样的异常时,Spring Boot返回由实现的getExitCode()
方法提供的退出代码。
11.管理员功能
通过指定spring.application.admin.enabled
属性,可以为应用程序启用与管理员相关的功能。这将SpringApplicationAdminMXBean
在平台上公开MBeanServer
。您可以使用此功能来远程管理Spring Boot应用程序。此功能对于任何服务包装器实现也可能很有用。
local.server.port。
SpringBoot官方文档学习(一)SpringApplication的更多相关文章
- SpringBoot官方文档学习(三)配置文件、日志、国际化和JSON
一.Profiles Spring配置文件提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用.任何@Component.@Configuration或@ConfigurationPr ...
- SpringBoot官方文档学习(一)开发你的第一个Spring Boot应用
一些准备工作: 本节介绍如何开发一个简单的“ Hello World!” Web应用程序,该应用程序重点介绍Spring Boot的一些关键功能.我们使用Maven来构建该项目,因为大多数IDE都支持 ...
- SpringBoot官方文档学习(二)Externalized Configuration(外部化配置)
Spring Boot允许您将配置外部化,以便可以在不同的环境中使用相同的应用程序代码.您可以使用属性文件.YAML文件.环境变量和命令行参数来具体化配置.属性值可以通过使用@Value注释直接注入b ...
- SpringBoot官方文档学习(二)使用Spring Boot构建系统
强烈建议您选择一个支持依赖关系管理并且可以使用发布到“ Maven Central”仓库的构建系统.我们建议您选择Maven或Gradle.其他构建系统(例如,Ant)也可以和Spring Boot一 ...
- Spring Boot 官方文档学习(一)入门及使用
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring boot官方文档学习(一)
个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
- Spring Data Commons 官方文档学习
Spring Data Commons 官方文档学习 -by LarryZeal Version 1.12.6.Release, 2017-07-27 为知笔记版本在这里,带格式. Table o ...
随机推荐
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- Linux进程的五个段
目录 数据段 代码段 BSS段 堆(heap) 栈 数据段 用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序静态分配的变量和全局变量: 代码段 代码段是用来存放可执行文件的操作指令,也就是 ...
- php位运算及其高级应用
我们之前学过逻辑与(&&) 条件1 && 条件2 当两边条件同时成立时候返回1 逻辑或(||) 条件1 || 条件2 当两边条件只要有一 ...
- Numpy学习笔记(上篇)
目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...
- 解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)
总结起来就是:设计器的版本要跟外部引用的库版本一致,否则XAML设计器就会显示不出来. 例如你的程序是X64的,但是引用的COM组件是32位的,就会显示不出来.这里的建议是:编译一个32位的COM中间 ...
- Linux用户管理的基本概念
Linux系统如何区别不同的用户呢?可以很自然地想到,使用不同的用户名应该是一个好主意,就像真实世界中每个人都有名字一样.但“用户名”只是一种方便让人读的字符串,对机器来说是没有意义的.事实上,Lin ...
- Oracle开放1521端口 telnet不通解决办法
在windosw虚拟机server2012上安装Oracle数据库后,远程连接失败,报 java.sql.SQLException: The Network Adapter could not est ...
- 1 集群状态、增删改查、全量替换、强制创建、设置单个index的分片数副本数
检查集群健康状态,可以看集群颜色.(黄色:primary shard都正常,replica不正常) GET /_cat/health?v 列出集群所有index GET /_cat/indices?v ...
- Redis安装--CentOS7上安装Redis
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 1.R ...
- AppRTC服务搭建(测试)
提供一个在线的webrtc服务器测试,需要的朋友看看.https://www.webrtcserver.cn/ 服务器搭建环境各有不同在此参考前人经验差试一下. 运行AppRTC需要使用Google ...