SpringApplication
SpringApplication类提供了一种方便的方法来引导将从main()方法启动的Spring应用程序。 在许多情况下,您可以委托到静态SpringApplication.run方法:
public static void main(String[] args) {
SpringApplication.run(MySpringConfiguration.class, args);
}
当您的应用程序启动时,您应该看到类似以下内容:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: v2.0.0.BUILD-SNAPSHOT
2013-07-31 00:08:16.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)
2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080
2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
默认情况下,将显示INFO日志消息,包括一些相关的启动详细信息,例如启动应用程序的用户。
启动失败
如果你的应用无法启动,注册的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实现,你可以很容易的添加你自己的实现
如果没有故障分析器能够处理异常,你仍然可以显示完整的自动配置报告,以更好的了解出错的原因.为此,你需要启动debug属性或启用对org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer的DEBUG日志记录。
例如,如果你需要使用Java -jar运行应用,则可以按如下所示启用调试属性:
$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
自定义Banner
在启动时打印的banner可以通过将banner.txt文件添加到classpath或将banner.location设置为此类文件的位置来更改。如果文件有一个不寻常的编码,你可以设置banner.charset(默认是UTF-8). 除了文本文件,您还可以将banner.gif,banner.jpg或banner.png图像文件添加到classpath中,或者设置banner.image.location属性。 图像将转换为ASCII艺术表示,并打印在任何文本banner上方。
在banner.txt文件中,您可以使用以下任何占位符:
变量 | 描述 |
---|---|
${application.version} | 在MANIFEST.MF中声明的应用程序的版本号。 例如,实现版本:1.0打印为1.0。 |
${application.formatted-version} | 在MANIFEST.MF中声明的应用程序的版本号,格式化为显示(用方括号括起来并以v开头)。 例如(v1.0)。 |
${spring-boot.version} | 您正在使用的Spring Boot版本。 例如2.0.0.BUILD-SNAPSHOT。 |
${spring-boot.formatted-version} | 使用格式化显示的Spring Boot版本(用方括号括起来并以v开头)。 例如(v2.0.0.BUILD-SNAPSHOT)。 |
${Ansi.NAME} (or ${AnsiColor.NAME}, ${AnsiBackground.NAME}, ${AnsiStyle.NAME}) | 其中NAME是ANSI转义代码的名称。 有关详细信息,请参阅AnsiPropertySource。 |
${application.title} | 在MANIFEST.MF中声明的应用程序的标题。 例如实现标题:MyApp作为MyApp打印。 |
如果要以编程方式生成Banner,可以使用SpringApplication.setBanner(...)方法。 使用org.springframework.boot.Banner接口并实现您自己的printBanner()方法。
还可以使用spring.main.banner-mode属性确定是否必须使用配置的logger(log)或不字System.out(console)打印Banner。 翻译
打印的banner将注册为名为springBootBanner的单例bean。(The printed banner will be registered as a singleton bean under the name springBootBanner.)
YAML映射off为false,因此如果要在应用程序中禁用Banner,请务必添加引号。
spring: main: banner-mode: "off"
自定义SpringApplication
你可以创建一个实例来自定义SpringApplication.比如你要关闭Banner打印,你可以这样写:
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,有关详细信息,请参考“外部化配置”。 有关配置选项的完整列表,请参考SpringApplication Javadoc。
Fluent builder Api
如果您需要构建一个ApplicationContext层次结构(具有praent/child关系的多个上下文),或者如果你只是喜欢使用"Fluent"构建器api,则可以使用SpringApplicationBuilder。 SpringApplicationBuilder允许您将多个方法调用链接在一起,并且包括允许创建层次结构的父方法和子方法。 例如:
new SpringApplicationBuilder()
.sources(Parent.class)
.child(Application.class)
.bannerMode(Banner.Mode.OFF)
.run(args);
在创建ApplicationContext层次结构时有一些限制,例如 Web组件必须包含在子上下文中,并且相同的环境将用于父上下文。 有关完整的详细信息,请参考SpringApplicationBuilder Javadoc。
Application事件和监听器
除了通常的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
在应用程序运行时,应用程序事件按以下顺序发送:
- ApplicationStartedEvent在运行开始时发送,在除了监听器和初始化器的注册之外的任何处理之前发送。
- 在上下文(context)创建之前,发送ApplicationEnvironmentPreparedEvent。
- ApplicationPreparedEvent在bean定义已加载之后refresh开始之前发送。
- 在refresh并且已经处理任何相关的回调以指示应用程序准备好服务请求之后发送ApplicationReadyEvent.
- 如果启动时存在异常,则会发送ApplicationFailedEvent。
一般你不需要使用Application事件,但是它可以方便的知道这些事件的发生.Spring Boot在内部使用事件来处理各种任务
Web环境
Spring Boot会尝试帮你创建正确类型的ApplicationContext。默认情况下,将使用AnnotationConfigApplicationContext或AnnotationCOnfigEmbeddedWebAPplicationContext,具体取决于你的应用是否是web应用。
用于确定"web环境"的算法相当简单(基于几个类存在的判断).如果需要覆盖默认值,可以使用setWebEnvironment(boolean webEnvironment).还可以通过调用setApplicationContextClass(...)来完全控制将要使用的ApplicationContext类型
在JUnit测试中使用SpringApplication时,通常需要调用setWebEnvironment(false)。
访问应用程序参数
如果你需要访问传递给SpringApplication.run(...)的参数,你可以注入一个org.springframework.boot.ApplicationArguments bean。ApplicationArguments接口提供对原始String[]参数的访问以及解析选项和非选项参数的访问:
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环境注册一个CommandLinePropertySource。 它可以使用@Value注解注入单个应用程序参数。
使用ApplicationRunner或CommandLineRunner
如果你要在SpringApplication启动后运行一些特定代码,那么可以实现ApplicationRUnner或CommandLineRunner接口.两个接口以相同的方式工作,并提供一个单一的运行方法,它将在SpringApplication.run(...)完成之前调用.
CommandLineRunner接口提供对应用程序参数的访问,作为一个简单字符串数组。而ApplicationRunner使用上面讨论的ApplicationArguments接口.
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注解。
应用退出
每个SpringApplication将注册一个jvm的关闭钩子,以确保ApplicationContext在退出时优雅地关闭.可以使用所有的标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy注解).
另外,如果希望在应用程序结束时返回特定的退出代码,那么可以实现org.springframework.boot.ExitCodeGenerator接口.
管理功能
通过指定spring.application.admin.enabled属性,可以为应用程序启用与管理相关的功能。 这暴露了平台MBeanServer上的SpringApplicationAdminMXBean。 您可以使用此功能远程管理您的Spring Boot应用程序。 这也可以用于任何服务包装器实现。
如果您想知道应用程序在哪个HTTP端口上运行,请获取带有local.server.port键的属性。 启用此功能时请小心,因为MBean公开了关闭应用程序的方法。