4. Spring Boot功能

4.1。Spring应用

便捷的启动方式:

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

SpingBoot默认日志级别是INFO

4.1.1。启动失败

启动失败时,FailureAnalyzers会报告错误信息。

4.1.2。延迟初始化(懒加载)

SpringApplication允许延迟初始化应用程序。启用延迟初始化后,将根据需要创建bean,而不是在应用程序启动期间创建bean。

以下方式可以启动延迟初始化:

  1. SpringApplicationBuilder启动
org.springframework.boot.builder.SpringApplicationBuilder#lazyInitialization
  1. SpringApplication指定
org.springframework.boot.SpringApplication#setLazyInitialization
  1. 属性配置
spring.main.lazy-initialization=true

对bean使用延迟初始化,可以使用@Lazy注解。

4.1.3。定制Banner

banner.txt 或图像文件(banner.gifbanner.jpgbanner.png)放在类路径,或通过设置属性指定路径spring.banner.location(图像为spring.banner.image.location)。图像将转换为ASCII

banner.txt文件内部,可以使用以下任意占位符,参考:

变量 描述
${application.version} 您的应用程序的版本号,如MANIFEST.MF中所述。例如,Implementation-Version: 1.0打印为1.0。
${application.formatted-version} 您的应用程序的版本号,如MANIFEST.MF中所述,并进行了格式显示(用括号括起来,并带有前缀v)。例如(v1.0)。
${spring-boot.version} 您正在使用的Spring Boot版本。例如2.2.0.RELEASE。
${spring-boot.formatted-version} 您正在使用的Spring Boot版本,其格式用于显示(用括号括起来,并带有前缀v)。例如(v2.2.0.RELEASE)。
${Ansi.NAME}(或${AnsiColor.NAME}${AnsiBackground.NAME}${AnsiStyle.NAME} NAME是指ANSI转义代码的名称。有关详细信息,请参见AnsiPropertySource
${application.title} 您的应用程序的标题,如MANIFEST.MF中所述。例如Implementation-Title: MyApp打印为MyApp。

使用 org.springframework.boot.SpringApplication#setBanner 以编程方式生成Banner

属性spring.main.banner-mode 指定打印Banner的方式。

打印Banner的单实例bean的id是:springBootBanner

4.1.4。自定义SpringApplication

传递给SpringApplication构造函数的参数是Spring bean的配置源。在大多数情况下,这些是对@Configuration类的引用,但它们也可以是对XML配置或应扫描的程序包的引用。

也可以通过使用application.properties文件来配置。有关详细信息参见SpringApplication

有关配置选项的完整列表,参见org.springframework.boot.SpringApplication

4.1.5。流式Builder API

org.springframework.boot.builder.SpringApplicationBuilder

示例:

new SpringApplicationBuilder(SpringbootApplication.class).profiles("server")
.properties("transport=local").run(args);

创建ApplicationContext层次结构时有一些限制。例如,Web组件必须包含在子上下文中,并且父和子上下文都使用相同的Environment

4.1.6。应用程序事件和监听器

有些事件实际上是在创建ApplicationContext之前触发的,因此您无法将监听器注册为@Bean来监听事件。您可以使用SpringApplication.addListeners(...)方法或SpringApplicationBuilder.listeners(...)方法注册它们。

如果您希望这些侦听器自动注册,而不管创建应用程序的方式如何,可以将META-INF/spring.factories文件添加到项目中,并使用org.springframework.context.ApplicationListener键引用您的侦听器,如以下示例所示:

org.springframework.context.ApplicationListener = com.example.project.MyListener

分析启动方法

org.springframework.boot.SpringApplication#run(java.lang.String...)

应用程序事件在您的应用程序运行时按以下顺序发送,这些事件是绑定在SpringApplication上SpringApplicationEvents

  1. ApplicationStartingEvent在运行开始时发送 ,但在进行任何处理之前(侦听器和初始化程序的注册除外)发送。
listeners.starting();
  1. ApplicationEnvironmentPreparedEvent当Environment被发送到中已知的上下文中使用,但是在创建上下文之前。
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
  1. ApplicationContextInitializedEventApplicationContext准备好且已调用ApplicationContextInitializers之后,但未加载任何bean定义之前,发送。
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
listeners.contextPrepared(context);
  1. ApplicationPreparedEvent在刷新开始之前但在加载bean定义之后发送。
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
listeners.contextLoaded(context);
  1. ApplicationStartedEvent上下文已被刷新后,但是application runnerscommand-line runners被调用前,发送。
listeners.started(context);
  1. ApplicationReadyEventapplication runnerscommand-line runners被调用后发送。它指示该应用程序已准备就绪,可以处理请求。
listeners.running(context);
  1. ApplicationFailedEvent在启动异常时发送。
handleRunFailure(context, ex, exceptionReporters, listeners);

额外的事件,在ApplicationPreparedEventApplicationStartedEvent之间发送:

  1. ContextRefreshedEventApplicationContext刷新后发送。
  2. WebServerInitializedEvent在WebServer准备就绪后发送。ServletWebServerInitializedEventReactiveWebServerInitializedEvent分别是servlet和响应式servlet的变种。

应用程序事件是通过使用Spring Framework的事件发布机制发送的。此机制的一部分确保在子级上下文中发布给侦听器的事件也会在任何祖先上下文中发布给侦听器。因此,如果您的应用程序使用SpringApplication实例的层次结构,则侦听器可能会收到同一类型的应用程序事件的多个实例。

为了使您的侦听器能够区分其上下文的事件和后代上下文的事件,它应请求注入其应用程序上下文,然后将注入的上下文与事件的上下文进行比较。可以通过实现ApplicationContextAware来注入上下文,或者,如果侦听器是bean,则可以使用@Autowired注入上下文。

4.1.7。Web Environment

SpringApplication试图创建正确类型的ApplicationContext。确定WebApplicationType的算法非常简单:

  • 如果存在Spring MVC,则使用AnnotationConfigServletWebServerApplicationContext
  • 如果不存在Spring MVC且存在Spring WebFlux,则使用AnnotationConfigReactiveWebServerApplicationContext
  • 否则,使用AnnotationConfigApplicationContext

参考源码:

org.springframework.boot.SpringApplication#run(java.lang.String...)
context = createApplicationContext(); org.springframework.boot.SpringApplication#SpringApplication(org.springframework.core.io.ResourceLoader, java.lang.Class<?>...)
this.webApplicationType = WebApplicationType.deduceFromClasspath();

在同一应用程序中使用Spring MVCSpring WebFlux中的新功能,则默认情况下将使用Spring MVC。可以通过调用org.springframework.boot.SpringApplication#setWebApplicationType轻松覆盖它。也可以通过调用org.springframework.boot.SpringApplication#setApplicationContextClass 直接设置ApplicationContext

4.1.8。访问应用程序参数

如果您需要访问传递给SpringApplication.run(...)的应用程序参数,则可以注入org.springframework.boot.ApplicationArgumentsBeanApplicationArguments接口提供对原始String[]参数以及已解析option和non-option参数的访问,如以下示例所示:

@Component
public class MyBean {
@Autowired
public MyBean(ApplicationArguments args) {
boolean debug = args.containsOption("debug");
List<String> nonOptionArgs = args.getNonOptionArgs();
// if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
}
}

Spring Boot也向Spring Environment注册了一个CommandLinePropertySource。这样,您还可以使用@Value注释注入单个应用程序参数。

4.1.9。使用ApplicationRunnerCommandLineRunner

如果启动SpringApplication后需要运行一些特定的代码,则可以实现ApplicationRunnerCommandLineRunner接口。这两个接口以相同的方式工作,并提供一个单一的run方法,该方法在SpringApplication.run(...)完成之前就被调用。

参考源码:

org.springframework.boot.SpringApplication#run(java.lang.String...)
callRunners(context, applicationArguments);

Runner执行时不是异步调用,而是在ApplicationStartedEvent事件和ApplicationReadyEvent之间执行。

ApplicationRunnerCommandLineRunner接口的不同之处在于入参不同,前者是ApplicationArguments,后者是String...

如果有多个Runner,需要指定执行顺序时,可以实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。

4.1.10。Application Exit

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

如果希望在SpringApplication.exit()被调用时返回特定的退出代码,则可以实现org.springframework.boot.ExitCodeGenerator接口。然后可以将此退出代码传递给System.exit(),以将其作为状态代码返回。

而且,Exception实现ExitCodeGenerator接口后,当抛出异常时,Spring Boot返回由实现的getExitCode()方法提供的退出代码。

示例:

@SpringBootApplication
public class SpringbootApplication { @Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
} public static void main(String[] args) {
System.exit(SpringApplication.exit(SpringApplication.run(SpringbootApplication.class,
args)));
} }

直接停止虚拟机不能返回特定的退出代码。

4.1.11。管理员功能

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

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

20191110 Spring Boot官方文档学习(4.1)的更多相关文章

  1. 20191110 Spring Boot官方文档学习(3)

    3.使用Spring Boot 3.1.构建系统 建议选择Maven或Gradle作为构建工具 每个Spring Boot版本都提供了它所支持的依赖关系的精选列表.实际上,您不需要为构建配置中的所有这 ...

  2. 20191110 Spring Boot官方文档学习(4.2)

    4.2.外部化配置 Spring Boot使您可以外部化配置,以便可以在不同环境中使用相同的应用程序代码.您可以使用Properties文件,YAML文件,环境变量和命令行参数来外部化配置.属性值可以 ...

  3. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  4. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  5. 20191106 Spring Boot官方文档学习(1-2)

    学习内容相关信息 最新版本:2.2.0 CURRENT GA 官网地址 官方文档地址 单页版文档地址 代码生成网址 2.入门 Spring Boot的主要目标是: 为所有Spring开发提供更快且入门 ...

  6. 20191127 Spring Boot官方文档学习(9.1-9.3)

    9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...

  7. 20191128 Spring Boot官方文档学习(9.4-9.8)

    9.4.Spring MVC Spring Boot有许多启动器包含Spring MVC.请注意,一些启动器包括对Spring MVC的依赖,而不是直接包含它. 9.4.1.编写JSON REST服务 ...

  8. 20191128 Spring Boot官方文档学习【目录】

    Spring Boot文档 入门 使用Spring Boot 3.1. 构建系统 3.2. 结构化代码 3.3. 配置类 3.4. 自动配置 3.5. Spring beans和依赖注入 3.6. 使 ...

  9. 20191128 Spring Boot官方文档学习(9.11-9.17)

    9.11.消息传递 Spring Boot提供了许多包含消息传递的启动器.本部分回答了将消息与Spring Boot一起使用所引起的问题. 9.11.1.禁用事务JMS会话 如果您的JMS代理不支持事 ...

随机推荐

  1. js - 基础 之 预编译总结

    js运行步骤 语法解析(检查有无语法错误) 预编译 解释运行(将 js 翻译成计算机识别的语言(0.1组成),翻译一行执行一行) 预编译 [全局]: 创建 GO( Grobal Object ) 对象 ...

  2. Java并发编程实战 第14章 构建自定义的同步工具

    状态依赖性 定义:只有满足特定的状态才能继续执行某些操作(这些操作依赖于固定的状态,这些状态需要等待别的线程来满足). FutureTask,Semaphroe,BlockingQueue等,都是状态 ...

  3. Spring Boot Starters 究竟是怎么回事

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  4. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  5. Nginx之概念和简介

    Nginx是什么? 代理服务器,处于客户端和服务器端之间的一台服务器,不负责处理请求. 主要作用是什么? 1.负载均衡: 高并发场景下,Nginx代理服务器按一定规则将请求分发,从而使服务器能有条不紊 ...

  6. DOM自定义属性操作

        DOM标准     (一)核心DOM 可以操作一切结构化文档的API,包括HTML和XML,核心DOM是万能的,但又是繁琐的. (二)HTML DOM 专门操作HTML文档的简化版DOM AP ...

  7. 记一次CTF实验吧的代码审计

    0X01 0X01 Burp抓包找到hint 访问地址看源码 <?php $info = ""; $req = []; $flag="xxxxxxxxxx" ...

  8. Bootstrap Table 的X-editable插件怎么用

    在准备使用X-editable来做Bootstrap Table 的行内编辑的时候,根据http://www.cnblogs.com/landea... 的文章,我不能将全部效果重复实现,网上也搜索了 ...

  9. 第四周总结 & 实验报告(二)

    第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...

  10. material of DeepLearning

    下面这个链接是深度学习相关的资料,内含很多dl的链接资料: http://blog.csdn.net/augusdi/article/details/20238157 MIT Deep Learnin ...