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. 微信小程序-饮食日志_开发日志

    针对假期作业为父母或者身边的人做一款“小软件”这个课题,由于对 android 开发不熟悉 ,所以决定做一款微信小程序. 项目名称:饮食管理日志 目的:身边的人群对摄入食物热量及消耗不清楚,对健康需求 ...

  2. LOJ-6278-数列分块入门2(分块)

    链接: https://loj.ac/problem/6278 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数. 思路: 分块,用vector维护每个区 ...

  3. day02 计算机基础部分作业题

    1. 简述执行Python程序的两种方式以及他们的优缺点: 交互式: 优点:在cmd窗口环境下,运行Python解释器,执行一行代码打印一行,执行速度快,立马显示结果: 缺点:关闭窗口,被执行的代码和 ...

  4. 【NOIP2016提高A组模拟8.14】总结

    第一题是几何题,没去想直接弃疗.... 第二题觉得很像背包,但是单挑人的顺序不同,答案也会不同,我比较了每个人先后的优劣性,成功搞定了这道题.但是再输出时不小心搞错了,爆零. 第三题,我答案了整整一个 ...

  5. java中System类

    System作为系统类,在JDK的java.lang包中,可见它也是一种java的核心语言特性.System类的构造器由private修饰,不允许被实例化.因此,类中的方法也都是static修饰的静态 ...

  6. SQLite为何要用C语言来开发?

    SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust? C 语言是最好的 SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现.C 语言一直是实现 SQL ...

  7. 线程优先级队列( Queue)

    Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现 ...

  8. codevs 1002 搭桥x

    题目描述 Description 有一矩形区域的城市中建筑了若干建筑物,如果某两个单元格有一个点相联系,则它们属于同一座建筑物.现在想在这些建筑物之间搭建一些桥梁,其中桥梁只能沿着矩形的方格的边沿搭建 ...

  9. 在ThinkPHP框架(5.0.24)下引入Ueditor并实现向七牛云对象存储上传图片同时将图片信息保存到MySQL数据库,同时实现lazyload懒加载

    这是我花了很多天的时间才得以真正实现的一组需求. 文章后面有完整Demo的GitHub链接. 一. 需求描述 1. 应用是基于ThinkPHP5开发的: 2. 服务器环境是LNMP,PHP版本是7.2 ...

  10. REST framework 之 分页

    DRF分页组件 为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输 ...