启动方式
方式1:在main方法中执行SpringApplication.run()这种方式来启动咱们的工程css
// 方式一
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
方式二:SpringApplication.run()的底层其实就是new了一个SpringApplication的对象html
// 方式二
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.run(args);
}
方式三:SpringApplicationBuilderjava
// 方式三
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.run(args);
}
有时咱们须要建立多层次的ApplicationContext (例如,父子关系的Spring的ApplicationContext 和SpringMVC),这时咱们可使用官方提供的另一种“平滑”的API调用方式来启动工程,即便用SpringApplicationBuilder讲多个方法调用串起来,经过parent() 和 child()来建立多层次的ApplicationContext。若是查看底层代码,能够看到除了调用child()方法略有不一样,其余的和前两种方法几乎同样。git
启动失败
若是你的应用程序启动失败,注册的FailureAnalyzers
将有机会提供专用的错误消息和解决问题的具体操做。例如,若是你在端口8080
上启动web应用程序,而且该端口已经在使用,你应该会看到相似于如下消息的内容:github
*************************** 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
实现,你也能够添加本身的。

若是没有故障分析器可以处理的异常,你仍然能够显示完整的状况报告,以便更好地理解错误,要作到这一点,你须要为org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
启用debug属性或启用DEBUG日志记录。web
例如,若是你正在使用java -jar
运行你的应用程序,你可使启用debug
属性以下:算法
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
23.2 自定义横幅
在启动时打印的横幅能够经过添加banner.txt
文件到你的类路径或设置spring.banner.location
属性指向该文件的位置。若是文件的编码不是UTF-8
,那么能够设置spring.banner.charset
。除了一个文本文件,你还能够添加一个banner.gif
、banner.jpg
或banner.png
图像文件到你的类路径或设置spring.banner.image.location
属性。图像被转换成ASCII艺术表示,并打印在任何文本标题之上。spring
在你的banner.txt
文件,你可使用如下任何一个占位符:typescript
表23.1. Banner变量编程
变量 |
描述 |
${application.version} |
在MANIFEST.MF 中声明的应用程序的版本号,例如,Implementation-Version:1.0 被打印为1.0 |
${application.formatted-version} |
应用程序的版本号,如在MANIFEST.MF 中声明并格式化以供显示(包含了括号和前缀v ),例如(v1.0) ) |
${spring-boot.version} |
你正在使用的Spring Boot版本,例如2.0.5.RELEASE |
${spring-boot.formatted-version} |
你正在使用的Spring Boot版本,格式化用于显示(用括号括起来,并以v 为前缀),例如(v2.0.5.RELEASE) |
${Ansi.NAME} 或${AnsiColor.NAME} |
NAME 是ANSI转义代码的名称,有关详细信息,请参阅AnsiPropertySource |
${application.title} |
你的应用程序的标题,如声明的那样,在MANIFEST.MF 中,例如,Implementation-Title:MyApp 被打印为MyApp ) |
若是你想以编程的方式生成横幅,则可使用
SpringApplication.setBanner(…)
方法,使用
org.springframework.boot.Banner
接口和实现你本身的
printBanner()
方法。
示例:
// 启动颜色格式化
// 这不是惟一启动颜色格式的方式,有兴趣的同窗能够查看源码
/**
* 1. AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
* 2. 在`src/main/resources`目录下新建文件`application.properties`,
* 内容为:`spring.output.ansi.enabled=always`
*
* 重要:若是配置第二种方式,第一种方式就不会起做用
*/
AnsiOutput.setEnabled(AnsiOutput.Enabled.ALWAYS);
new SpringApplicationBuilder(ConfigServer.class)//
.main(SpringVersion.class) // 这个是为了能够加载 Spring 版本
.bannerMode(org.springframework.boot.Banner.Mode.CONSOLE)// 控制台打印
.run(args);
resources目录,增长一个banner.txt文件

你也能够用spring.main.banner-mode
属性肯定横幅是否必须打印在系统上System.out
(console
),发送到已配置的日志记录器(log
),或根本没有生成(off
)。
在如下名称中,打印的横幅被注册为一个单例bean:springBootBanner
。
YAML映射
off
到
false
,因此若是你想要禁用应用程序中的banner,请确保添加引号,以下例所示:
spring: main: banner-mode: "off"
23.3 定制SpringApplication
若是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
,详见第24节,外部化配置。
有关配置选项的完整列表,请参见SpringApplication Javadoc。
23.4 Fluent构建器API
若是你须要构建ApplicationContext
层次结构(包含parent
和child
关系的多个上下文),或者你更喜欢使用“fluent”构建器API,那么你可使用SpringApplicationBuilder
。
SpringApplicationBuilder
容许你将多个方法调用连接在一块儿,并包含让你建立层次结构的父类和子方法,以下例所示:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
在建立
ApplicationContext
层次结构时,有一些限制,例如,Web组件必须包含在子上下文内,而且在父类和子上下文环境中都使用相同的
Environment
,请参阅
SpringApplicationBuilder Javadoc了解详细信息。
23.5 应用程序事件和监听
除了一般的Spring框架事件,好比ContextRefreshedEvent以外,SpringApplication
还会发送一些附加的应用程序事件。
在建立
ApplicationContext
以前,实际上触发了一些事件,所以不能将侦听器注册为
@Bean
。你可使用
SpringApplication.addListeners(...)
方法或
SpringApplicationBuilder.listeners(...)
方法注册它们。若是你但愿这些监听器自动注册,无论应用程序是如何建立的,你均可以添加一个
META-INF/spring.factories
文件到你的项目,并经过使用
org.springframework.context.ApplicationListener
key来引用你的监听器,以下例所示:
org.springframework.context.ApplicationListener=com.example.project.MyListener
应用程序事件按如下顺序发送:
- 一个
ApplicationStartingEvent
是在运行开始时发送的,可是在任何处理以前,除了侦听器和初始化器的注册以外。
- 在建立上下文以前,当
Environment
在上下文中被使用时,就会发送一个ApplicationEnvironmentPreparedEvent
。
- 一个
ApplicationPreparedEvent
是在刷新开始以前发送的,可是在加载了bean定义以后。
- 在调用上下文以后发送一个
ApplicationStartedEvent
,可是在调用任何应用程序和命令行运行程序以前。
- 在调用任何应用程序和命令行运行程序后,将发送一个
ApplicationReadyEvent
,它代表应用程序已经准备好服务请求。
- 若是启动时出现异常,则发送
ApplicationFailedEvent
。
你一般不须要使用应用程序事件,可是知道它们的存在是很方便的。在内部,Spring Boot使用事件来处理各类任务。
使用Spring Framework的事件发布机制发送应用程序事件,该机制的一部分确保在子环境中发布给侦听器的事件也会在任何祖先上下文中被发布给监听器。所以,若是你的应用程序使用了SpringApplication
实例的层次结构,那么侦听器可能会接收到相同类型的应用程序事件的多个实例。
为了让你的侦听器区分事件的上下文和派生上下文的事件,它应该请求将其应用程序上下文注入,而后将注入的上下文与事件上下文进行比较,能够经过实现ApplicationContextAware
或若是侦听器是bean,经过使用@Autowired
来注入上下文。
23.6 Web环境
SpringApplication
试图为你建立合适的ApplicationContext
类型,用于肯定WebEnvironmentType
的算法至关简单:
- 若是Spring MVC存在,则使用
AnnotationConfigServletWebServerApplicationContext
。
- 若是Spring MVC不存在,Spring WebFlux是存在的,那么就使用一个
AnnotationConfigReactiveWebServerApplicationContext
。
- 不然,
AnnotationConfigApplicationContext
被使用。
这意味着若是你使用Spring MVC和来自Spring WebFlux的新WebClient
在相同的应用程序中,Spring MVC将在默认状况下使用,你能够经过调用setWebApplicationType(WebApplicationType)
来轻松覆盖它。
还能够调用setApplicationContextClass(…)
彻底控制所使用的ApplicationContext
类型。
在JUnit测试中使用
SpringApplication
时,一般须要调用
setWebApplicationType(WebApplicationType.NONE)
。
23.7 访问应用程序参数
若是你须要访问传递给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();
Spring Boot还会在Spring
Environment
中注册一个
CommandLinePropertySource
,这容许你使用
@Value
注解注入单个应用程序参数。
23.8 使用ApplicationRunner或CommandLineRunner
若是你须要在SpringApplication
启动以后运行一些特定的代码,你能够实现ApplicationRunner
或CommandLineRunner
接口,两个接口都以相同的方式工做,并提供了一个单独的run方法
,在SpringApplication.run(…)
完成以前调用。
CommandLineRunner
接口提供对应用程序参数的访问做为一个简单的字符串数组,而ApplicationRunner
使用前面讨论的ApplicationArguments
接口。下面的示例展现了一个使用run
方法的CommandLineRunner
:
import org.springframework.boot.*; import org.springframework.stereotype.*; @Component public class MyBean implements CommandLineRunner { public void run(String... args) {
若是定义了多个CommandLineRunner
或ApplicationRunner
bean,必须以特定的顺序调用它们,那么你能够额外地实现org.springframework.core.Ordered
接口或使用org.springframework.core.annotation.Order
注解。
23.9 应用程序退出
每一个SpringApplication
都向JVM注册一个关闭hook以确保ApplicationContext
在退出时优雅地关闭。可使用全部标准的Spring生命周期回调函数(如DisposableBean
接口或@PreDestroy
注解)。
此外,当SpringApplication.exit()
被调用时若是但愿返回特定的退出代码则bean能够实现org.springframework.boot.ExitCodeGenerator
接口。而后能够将此退出代码传递给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()
方法提供的退出代码。
23.10 管理功能
经过指定spring.application.admin.enabled
属性能够为应用程序启用与admin相关的特性,这将在平台MBeanServer
上公开SpringApplicationAdminMXBean,你可使用该特性远程管理你的Spring Boot应用程序,这个特性还能够用于任何服务wrapper实现。
若是你想知道应用程序正在运行哪一个HTTP端口,请使用
local.server.port
的键获取该属性。
在启用该特性时要注意,由于
MBean
公开了关闭应用程序的方法。