[翻译]Spring Boot 特征参考1

本文翻译自:http://docs.spring.io/spring-boot/docs/2.0.0.M2/reference/htmlsingle/

详细介绍Spring boot的关键特征,针对有一定springboot基础的同学。

1. SpringApplication

SpringApplication类提供一个简单的方法启动spring应用,通过启动amin()方法。在许多情况下,您只需委派静态SpringApplication.run方法:

public static void main(String[] args) {
    SpringApplication.run(MySpringConfiguration.class, args);
}

当你的应用启动,你应该看到如下:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::   v2.0.0.M2

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] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@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.TomcatServletWebServerFactory : 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)

默认的INFOlog信息将会显示,包含一些启动的详情,比如启动应用程序的用户。

1.1 启动错误

如果你启动失败,已经注册的FailureAnalyzers会产生专用消息,和提供修复操作。比如,你启动web应用,占用了8080端口,但是8080已经在用,你会看到如下信息:

***************************
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.

注意:springboot提供FailureAnalyzer的实现,你能轻松的把它添加到你的应用中。

如果analyzers没能捕获异常,你任然能够看到全自动配置的报告,以更好的了解出现的问题。要得到这样的效果,你需要启动debug属性,或者开始debug级别的日志。

org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

针对应用,你使用java -jar来启动应用,你可以向下面这样开启debug模式:

$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug

1.2 定制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文件中你能使用任何以下的占位符:

Banner变量

variable Description
${application.version} MANIFEST.MF中声明的应用版本号,比如Implementation-Version: 1.0会输出1.0
${application.formatted-version} MANIFEST.MF中声明的应用版本号,且格式化输出(用括号包围,用v做前缀),比如(v1.0 )
${spring-boot.version} 使用的springboot版本,比如2.0.0.M2
${spring-boot.formatted-version} 使用格式化输出springboot版本(用括号包围,用v做前缀)。
{Ansi.NAME}(or ${AnsiColor.NAME},${AnsiBackground.NAME},${AnsiStyle.NAME}) 其中NAME是ANSI转义码的名称.
{application.title} MANIFEST.MF中定义的应用的名称。比如Implementation-Title:MyApp会输出MyApp

你也能使用spring.main.banner-mode属性来确定是否必须在System.out(console)中打印banner,用配置过的logger(log)或者禁用log(off)。

打印banner会被注册为一个单例bean,名称叫springBootBanner

注意:如果你想在应用中禁用banner,YAML数据格式能映射offfalse,所以需确认加了引号。

spring:
    main:
        banner-mode: "off"

1.3 定制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配置或应扫描的包。

也可以配置SpringApplication使用application.properties文件。

1.4 流式构建API

如果您需要构建一个ApplicationContext层次结构(具有父/子关系的多个上下文),或者如果您只想使用"流式"构建器API,则可以使用SpringApplicationBuilder

SpringApplicationBuilder允许您链接多个方法调用,并包括允许您创建层次结构的父和子方法。

例如:

new SpringApplicationBuilder()
        .sources(Parent.class)
        .child(Application.class)
        .bannerMode(Banner.Mode.OFF)
        .run(args);

注意:创建ApplicationContext层次结构时有一些限制,例如Web组件必须包含在子上下文中,并且相同的环境将用于父和子上下文。有关详细信息,请参阅SpringApplicationBuilder Javadoc。

1.5 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

应用程序事件按照以下顺序发送,因为您的应用程序运行:

  • ApplicationStartingEvent在运行开始时发送,但在除了注册侦听器和初始化器之外的任何处理之前发送。
  • 当上下文中要使用的环境已知但在创建上下文之前,将发送ApplicationEnvironmentPreparedEvent。
  • ApplicationPreparedEvent在启动刷新之前发送,但在加载了bean定义之后。
  • ApplicationReadyEvent在刷新之后被发送,并且处理了任何相关的回调以指示应用程序准备好服务请求。
  • 如果启动时发生异常,则发送ApplicationFailedEvent。

1.6 Web环境

SpringApplication将尝试代表您创建正确类型的ApplicationContext。默认情况下,将使用AnnotationConfigApplicationContext或AnnotationConfigServletWebServerApplicationContext,具体取决于您是否正在开发Web应用程序。

用于确定"Web environment"的算法是相当简单的(基于几个类的存在)。如果需要覆盖默认值,可以使用setWebEnvironment(boolean webEnvironment)。

也可以完全控制将通过调用setApplicationContextClass(...)使用的ApplicationContext类型。

注意:在JUnit测试中使用SpringApplication时,通常需要调用setWebEnvironment(false)。

1.7 访问应用参数

如果您需要访问传递给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注释注入单个应用程序参数。

1.8 使用 ApplicationRunner or 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...
    }

}

您可以额外实现org.springframework.core.Ordered接口,也可以使用org.springframework.core.annotation.Order注释,如果定义了多个CommandLineRunner或ApplicationRunner bean,这些bean必须按特定顺序调用。

1.9 退出应用

每个SpringApplication将注册一个关闭钩子与JVM,以确保ApplicationContext在退出时正常关闭。可以使用所有标准的Spring生命周期回调(例如DisposableBean接口或@PreDestroy注释)。

另外,如果bean希望在应用程序结束时返回特定的退出代码,那么bean可以实现org.springframework.boot.ExitCodeGenerator接口。

1.10 admin特性

可以通过指定spring.application.admin.enabled属性为应用程序启用与管理相关的功能。这会在平台MBeanServer上公开SpringApplicationAdminMXBean。您可以使用此功能来远程管理您的Spring Boot应用程序。这对于任何服务包装器实现也是有用的。

注意:如果您想知道应用程序在哪个HTTP端口上运行,请使用local.server.port键获取该属性。

注意:启用此功能时请小心,因为MBean公开了关闭应用程序的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容