SpringApplication常见用法说明
启动方式
方式1:在main方法中执行SpringApplication.run()这种方式来启动我们的工程
// 方式一
@SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
方式二:SpringApplication.run()的底层其实就是new了一个SpringApplication的对象
// 方式二
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.run(args);
}
方式三:SpringApplicationBuilder
// 方式三
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()方法略有不同,其他的和前两种方法几乎一样。
启动失败
如果你的应用程序启动失败,注册的FailureAnalyzers将有机会提供专用的错误消息和解决问题的具体操作。例如,如果你在端口8080上启动web应用程序,并且该端口已经在使用,你应该会看到类似于以下消息的内容:
***************************
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日志记录。
例如,如果你正在使用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艺术表示,并打印在任何文本标题之上。
在你的banner.txt文件,你可以使用以下任何一个占位符:
表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.ApplicationListenerkey来引用你的监听器,如下例所示:
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();
// if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
}
}
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) {
// Do something...
}
}
如果定义了多个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公开了关闭应用程序的方法。
SpringApplication常见用法说明的更多相关文章
- Linux中find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- find常见用法
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; find命令的参数 ...
- iOS 开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- iOS开发多线程篇—GCD的常见用法
iOS开发多线程篇—GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) ...
- [转]EasyUI——常见用法总结
原文链接: EasyUI——常见用法总结 1. 使用 data-options 来初始化属性. data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我 ...
- NSString常见用法总结
//====================NSStirng 的常见用法==================== -(void)testString { //创建格式化字符串:占位符(由一个%加一个字 ...
- [转]Linux中find常见用法示例
Linux中find常见用法示例[转]·find path -option [ -print ] [ -exec -ok command ] {} \;find命令的参 ...
随机推荐
- java自适应响应式 企业网站源码 SSM 生成静态化 手机 平板 PC
java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 系统介绍: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成ht ...
- 如何设计提高服务API的安全性(一)基础介绍
场景 现今越来越多公司提供了Sass平台服务,大部分也直接提供API.如快递鸟.微信Api.云服务.如何保证这些服务的安全性是一门重要的课题.如快递跟踪.机票查询等很便捷地影响着我们d的生活,对这些技 ...
- ETL中获取公共时间参数变量释义
- AIX系统逻辑卷管理
前言: 前期项目需要部署多套AIX环境下RAC集群,之前很少接触AIX系统,上来被创建逻辑卷等基本命令打脸了,其实网上搜下资料很多,总结一下,也是方便自己日后查阅. 创建逻辑卷 1.查看所有磁盘设备 ...
- Collaborative Spatioitemporal Feature Learning for Video Action Recognition
Collaborative Spatioitemporal Feature Learning for Video Action Recognition 摘要 时空特征提取在视频动作识别中是一个非常重要 ...
- HDU6583:Typewriter(dp+后缀自动机)
传送门 题意: 给出\(p,q\),现在要你生成一个字符串\(s\). 你可以进行两种操作:一种是花费\(p\)的代价随意在后面添加一个字符,另一种是花费\(q\)的代价可以随意赋值前面的一个子串. ...
- djabgo 中间件
1.中间件是发生在request和response 之间,都会经过中间键, 上述截图中的中间件都是django中的,我们也可以自己定义一个中间件,我们可以自己写一个类,但是必须继承Middleware ...
- 201871010135 张玉晶 《2019面向对象程序设计(java)课程学习进度条》
<2019面向对象程序设计(java)课程学习进度条> 周次 (阅读/编写)代码行数 发布博客量/评论他人博客数量 课余学习时间(小时) 学习收获最大的程序 阅读或编译让我 第一周 25/ ...
- 如何让ThinkPHP支持模糊搜索
最近ytkah在做一个ThinkPHP的项目时发现了一个问题,搜索的功能只能检索出以*为开头的内容,不能检索出中间的词.例如:搜索包含6775的产品,搜索结果为空,而搜索000-6775 就有两个结果 ...
- VSS 使用方法
VSS 的全称为 Visual Source Safe .作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目.管理软件开发中各 ...