1. SpringApplication

SpringApplication类提供了一种方便的方式来引导从main()方法启动的Spring应用程序。在很多情况下,你可以委托给静态的SpringApplication.run方法,如下面的例子所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class MyApplication { public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
} }

1.1. Startup Failure

如果应用程序启动失败,注册的failureanalyzer将有机会提供专门的错误消息和解决问题的具体操作。例如,如果你在端口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 is listening on port 8080 or configure this application to listen on another port.

Spring Boot提供了许多FailureAnalyzer实现,您可以添加自己的实现。类似于:

package dev.farhan.movies.cache;

import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis;
import org.springframework.stereotype.Service; @Service
public class Failure extends AbstractFailureAnalyzer {
@Override
protected FailureAnalysis analyze(Throwable rootFailure, Throwable cause) {
if (rootFailure.getMessage().equals("classnotfound......")){
System.out.println("版本不对,找不到类");
}
return null;
}
}

1.2. Lazy Initialization

SpringApplication允许惰性初始化应用程序。当启用延迟初始化时,bean将在需要时创建,而不是在应用程序启动时创建。因此,启用延迟初始化可以减少应用程序启动所需的时间。在web应用程序中,启用延迟初始化将导致许多与web相关的bean在收到HTTP请求之前不会初始化。

总之就是好处是:减少应用程序启动的时间。坏处是:如果延迟初始化配置错误的bean,则在启动期间将不再发生失败,并且只有在初始化bean时才会出现问题。

延迟初始化可以通过编程方式使用SpringApplicationBuilder上的lazyInitialization方法或SpringApplication上的setLazyInitialization方法来启用。或者,也可以使用spring.main来启用它。惰性初始化属性,示例如下:

spring:
main:
lazy-initialization: true

1.3. Customizing the Banner

可以通过在类路径中添加banner.txt文件或通过将spring.banner.location属性设置为此类文件的位置来更改在启动时打印的横幅。如果文件的编码不是UTF-8,则可以设置spring.banner.charset。

1.4. Customizing SpringApplication

如果SpringApplication默认值不符合您的口味,您可以创建一个本地实例并对其进行定制。例如,要关闭横幅,你可以这样写:

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class MyApplication { public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setBannerMode(Banner.Mode.OFF);
application.run(args);
} }

1.5. Fluent Builder API

如果你需要构建一个ApplicationContext层次结构(具有父/子关系的多个上下文),或者如果你更喜欢使用“流畅”的构建器API,你可以使用SpringApplicationBuilder。
SpringApplicationBuilder允许你将多个方法调用链接在一起,并包含父方法和子方法,让你创建一个层次结构,如下面的例子所示:

package dev.farhan.movies;

import org.springframework.boot.Banner;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean; @SpringBootApplication
@EnableCaching
public class MoviesApplication { @Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
} public static void main(String[] args) {
new SpringApplicationBuilder().sources(MoviesApplication.class)
.bannerMode(Banner.Mode.OFF)
.run(args); //SpringApplication.run(MoviesApplication.class, args);
//System.out.println(SpringApplication.exit(SpringApplication.run(MoviesApplication.class, args)));
} }

1.6. Application Availability

当部署在平台上时,应用程序可以使用Kubernetes Probes等基础设施向平台提供有关其可用性的信息。Spring Boot包括对常用的“活跃”和“就绪”可用性状态的开箱即用支持。如果您正在使用Spring Boot的“执行器”支持,那么这些状态将作为健康端点组公开。
此外,您还可以通过将ApplicationAvailability接口注入到您自己的bean中来获得可用性状态。

1.6.1. Liveness State

应用程序的“活跃”状态告诉我们,它的内部状态是否允许它正常工作,或者如果当前出现故障,它是否可以自行恢复。中断的“活跃”状态意味着应用程序处于无法恢复的状态,基础设施应该重新启动应用程序。

一般来说,“活动性”状态不应该基于外部检查,比如健康检查。如果是这样,失败的外部系统(数据库、Web API、外部缓存)将触发大量重启和跨平台的级联故障。

Spring Boot应用程序的内部状态主要由Spring ApplicationContext表示。如果应用程序上下文已经成功启动,Spring Boot假定应用程序处于有效状态。只要上下文被刷新,应用程序就被认为是活动的。

1.6.2. Readiness State
应用程序的“就绪”状态告诉应用程序是否准备好处理流量。失败的“就绪”状态告诉平台,它现在不应该将流量路由到应用程序。这通常发生在启动期间,当commandlinerrunner和ApplicationRunner组件正在处理时,或者在任何时候,如果应用程序决定它太忙而无法接收额外的流量。
一旦调用了应用程序和命令行运行程序,就认为应用程序准备好了
1.6.3. Managing the Application Availability State
package dev.farhan.movies.cache;

import org.springframework.boot.availability.AvailabilityChangeEvent;
import org.springframework.boot.availability.ReadinessState;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component; @Component
public class MyReadinessStateExporter { @EventListener
public void onStateChange(AvailabilityChangeEvent<ReadinessState> event) {
switch (event.getState()) {
case ACCEPTING_TRAFFIC:
// create file /tmp/healthy
break;
case REFUSING_TRAFFIC:
// remove file /tmp/healthy
break;
}
} }

1.7. Application Events and Listeners

在应用程序运行时,应用程序事件按以下顺序发送:

  1. ApplicationStartingEvent在运行开始时发送,但在任何处理之前发送,除了侦听器和初始化器的注册。

  2. 当要在上下文中使用的环境已知时,但在创建上下文之前,将发送ApplicationEnvironmentPreparedEvent。

  3. 当ApplicationContext准备好并且ApplicationContextInitializedEvent被调用时,在加载任何bean定义之前发送applicationcontextinitialalizer。

  4. ApplicationPreparedEvent在刷新开始之前、加载bean定义之后发送。

  5. ApplicationStartedEvent在上下文刷新之后,但在调用任何应用程序和命令行运行程序之前发送。

  6. 紧接着发送一个AvailabilityChangeEvent和livessstate。正确表示应用程序被认为是活动的。

  7. 在调用任何应用程序和命令行运行程序后发送ApplicationReadyEvent。

  8. 紧接着发送一个AvailabilityChangeEvent和ReadinessState。ACCEPTING_TRAFFIC表示应用程序已准备好处理请求。

  9. 如果在启动时出现异常,则发送ApplicationFailedEvent。

WebServerInitializedEvent在WebServer准备好后发送。ServletWebServerInitializedEvent和ReactiveWebServerInitializedEvent分别是servlet和响应变体。
当ApplicationContext被刷新时,发送一个ContextRefreshedEvent。

事件监听器不应该运行可能很长的任务,因为它们默认在同一个线程中执行。考虑使用应用程序和命令行运行器。likethis    本章的1.10

1.8. Web Environment

SpringApplication尝试为您创建正确类型的ApplicationContext。用于确定WebApplicationType的算法如下:

  • 如果Spring MVC存在,则使用AnnotationConfigServletWebServerApplicationContext

  • 如果Spring MVC不存在,而Spring WebFlux存在,则使用AnnotationConfigReactiveWebServerApplicationContext

  • 否则,使用AnnotationConfigApplicationContext

1.9. Accessing Application Arguments

如果需要访问传递给SpringApplication.run(…)的应用程序参数,可以注入org.springframework.boot.ApplicationArguments bean。ApplicationArguments接口提供了对原始String[]参数以及解析后的选项和非选项参数的访问,如下面的示例所示:

import java.util.List;

import org.springframework.boot.ApplicationArguments;
import org.springframework.stereotype.Component; @Component
public class MyBean { public MyBean(ApplicationArguments args) {
boolean debug = args.containsOption("debug");
List<String> files = args.getNonOptionArgs();
if (debug) {
System.out.println(files);
}
// if run with "--debug logfile.txt" prints ["logfile.txt"]
} }

测试:

package com.example.demo;

import com.example.demo.demos.MyBean;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.DefaultApplicationArguments;
import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest
class DemoApplicationTests { @Autowired
private MyBean myBean; @Test
void contextLoads() {
} @Test
public void testMyBean() {
String[] args = {"--debug", "logfile.txt"};
ApplicationArguments arguments = new DefaultApplicationArguments(args);
myBean = new MyBean(arguments); }
}

运行结果:

1.10. Using the ApplicationRunner or CommandLineRunner

如果需要在SpringApplication启动后运行一些特定的代码,可以实现ApplicationRunner或commandlinerrunner接口

package dev.farhan.movies.cache;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component; @Component
public class MyCommandLineRunner implements CommandLineRunner { @Override
public void run(String... args) {
System.out.println("sb该启动了-------------");
} }

1.11. Application Exit

项目退出时,可以创建一个退出码,给jvm,类似于:

package dev.farhan.movies;

import org.springframework.boot.Banner;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean; @SpringBootApplication
@EnableCaching
public class MoviesApplication { @Bean
public ExitCodeGenerator exitCodeGenerator() {
return () -> 42;
} public static void main(String[] args) {
new SpringApplicationBuilder().sources(MoviesApplication.class)
.bannerMode(Banner.Mode.OFF)
.run(args); //SpringApplication.run(MoviesApplication.class, args);
System.exit(SpringApplication.exit(SpringApplication.run(MoviesApplication.class, args)));
} }

1.12. Admin Features

通过指定spring.application.admin.enabled属性,可以为应用程序启用与管理相关的特性。这将在MBeanServer平台上公开SpringApplicationAdminMXBean。您可以使用此特性远程管理Spring Boot应用程序。此特性对于任何服务包装器实现也很有用。
如果您想知道应用程序正在哪个HTTP端口上运行,那么使用local.server.port的键获取该属性。

1.13. Application Startup tracking

将信息写入缓冲区

在应用程序启动期间,SpringApplication和ApplicationContext执行许多与应用程序生命周期、bean生命周期甚至处理应用程序事件相关的任务。通过ApplicationStartup, Spring Framework允许你使用StartupStep对象来跟踪应用程序的启动顺序。收集这些数据可以用于分析目的,或者只是为了更好地理解应用程序启动过程。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup; @SpringBootApplication
public class MyApplication { public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
} }

2. Externalized Configuration

Spring Boot允许您外部化您的配置,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java属性文件、YAML文件、环境变量和命令行参数。

属性值可以通过使用@Value注释直接注入到bean中,通过Spring的环境抽象进行访问,或者通过@ConfigurationProperties绑定到结构化对象。

Spring Boot使用一个非常特殊的PropertySource顺序,旨在允许合理的值重写。以后的属性源可以覆盖在以前的属性源中定义的值。来源按下列顺序:

  1. 默认属性(通过设置SpringApplication.setDefaultProperties指定)。

  2. @PropertySource 你的注释 @Configuration类上的注释。请注意,在刷新应用程序上下文之前,不会将此类属性源添加到环境中。这对于配置某些属性(如日志记录)来说太晚了。*和spring.main。*在刷新开始前读取。

  3. 配置数据(如应用程序)。属性文件)。

  4. RandomValuePropertySource只具有random.*中的属性。

  5. 操作系统环境变量。

  6. Java系统属性(System. getproperties())。

  7. 来自java:comp/env的JNDI属性。

  8. ServletContext初始化参数。

  9. ServletConfig初始化参数。

  10. 来自SPRING_APPLICATION_JSON的属性(嵌入在环境变量或系统属性中的内联JSON)。

  11. 处理命令行参数

  12. 属性,可以在@SpringBootTest和测试注释中获得,用于测试应用程序的特定部分。

  13. @DynamicPropertySource 测试中的注释。

  14. @TestPropertySource 测试上的注释。

  15. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active.

配置数据文件按以下顺序考虑:

  1. Application properties 打包在您的jar(应用程序)中。属性和YAML变体)。

  2. Profile-specific application properties 打包在jar (application-{profile})中。属性和YAML变体)。

  3. Application properties 在打包的jar(应用程序)之外。属性和YAML变体)。

  4. Profile-specific application properties 在打包的jar (application-{profile})之外。属性和YAML变体)。

建议在整个应用程序中坚持使用一种格式。如果在同一位置有.properties和YAML格式的配置文件,则.properties优先。

为了提供一个具体的例子,假设你开发了一个使用name属性的@Component,如下面的例子所示:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component
public class MyBean { @Value("${name}")
private String name; // ... }

2.1. Accessing Command Line Properties

默认情况下,SpringApplication将任何命令行选项参数(即以——开头的参数,例如——server.port=9000)转换为属性,并将它们添加到Spring环境中。如前所述,命令行属性总是优先于基于文件的属性源。
如果不希望将命令行属性添加到环境中,可以使用SpringApplication.setAddCommandLineProperties(false)禁用它们。

2.2. JSON Application Properties

java -Dspring.application.json='{"my":{"name":"test"}}' -jar myapp.jar

尽管JSON中的空值将被添加到结果属性源中,但PropertySourcesPropertyResolver将空属性视为缺失值。这意味着JSON不能用空值覆盖来自低阶属性源的属性。

2.3. External Application Properties

Spring Boot会自动找到并加载应用程序。属性和应用程序。当应用程序启动时,从以下位置获取Yaml文件:

  1. 从类路径

    1. 类路径root

    2. 类路径/配置包

  2. 从当前目录

    1. 使用当前目录

    2. 当前目录下的config/子目录

    3. config/子目录的直接子目录

该列表按优先级排序(较低项的值覆盖较早项的值)。加载文件中的文档作为propertresources添加到Spring环境中

不想写了,下回合见,记得关注不迷路

SpringCore 完整学习教程1,入门级别的更多相关文章

  1. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

  2. mysql部分学习心得(入门级别)

    mysql中针对不同的数据选择对应的存储引擎 mysql中也会针对不同的数据处理选择对应的存储的引擎 mysql中也会针对不同的数据处理选择对应的存储的引擎 mysql中一些授权(grant)等的通常 ...

  3. Linux入门学习教程:虚拟机体验之KVM篇

    本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2.       dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...

  4. MyBatis入门学习教程-使用MyBatis对表执行CRUD操作

    上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...

  5. 【入门必备】最佳的 Node.js 学习教程和资料书籍

    Web 开发人员对 Node.js 的关注日益增多,更多的公司和开发者开始尝试使用 Node.js 来实现一些对实时性要求高,I/O密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...

  6. C#入门教程(二)–C#常用快捷键、变量、类型转换-打造C#学习教程

    C#入门教程(一)–.Net平台技术介绍.C#语言及开发工具介绍-打造C#学习教程 上次教程主要介绍了.Net平台以及C#语言的相关介绍.以及经典程序案例,helloworld程序. 初来乍到,第一次 ...

  7. TensorFlow 中文资源全集,官方网站,安装教程,入门教程,实战项目,学习路径。

    Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...

  8. Nginx 入门学习教程

    昨天听一个前同事说他们公司老大让他去研究下关于Nginx 方面的知识,我想了下Nginx 在如今的开发技术栈中应该会很大可能会用到,所以写篇博文记录总结下官网学习教程吧. 1. 什么是Nginx? 我 ...

  9. 【halcon教程资料】全网汇总如何快速、高效率学习机器视觉从入门到精通

    我以八年的视觉工程师开发的工作经验告诉你,你不要再因为学习halcon发愁了,我接触过很多学习halcon的小白,并不是不愿意学,而是不知道怎么快速.高效率的学习精通,一天天的过去了,对学习halco ...

  10. Tensorflow学习教程------读取数据、建立网络、训练模型,小巧而完整的代码示例

    紧接上篇Tensorflow学习教程------tfrecords数据格式生成与读取,本篇将数据读取.建立网络以及模型训练整理成一个小样例,完整代码如下. #coding:utf-8 import t ...

随机推荐

  1. 古早wp合集

    0x00 首先非常感谢大家阅读我的第一篇.本文章不仅仅是题解,一些细枝末节的小问题也欢迎大家一起解答. 小问题的形式如Qx:xxxxxxx? 欢迎发现小问题并讨论~~ N1nE是本人另外一个名字,目前 ...

  2. [FlareOn4]login-buu ctf

    打开压缩包 是个html,我直接???? 这不是web弄的吗 离谱了,不过f12还是会的 不过其中的逻辑还是比较清楚的 先用伪代码确定加密逻辑,再直接写直接进行爆破解码 wo cao,wrong!fl ...

  3. P3378 【模板】二叉堆

    [洛谷]P3378 [模板]堆 方法一 手写堆 最小堆插入 从新增的最后一个结点的父结点开始,用要插入元素向下过滤上层结点(相当于要插入的元素向上渗透) void siftdown(int i) // ...

  4. 介绍 SafeCoder 解决方案服务

    今天这篇推文,我们打算给自己打一波"广告",向大家隆重介绍 SafeCoder-- 一款专为企业打造的代码助手解决方案. SafeCoder 旨在成为你完全合规且自托管的结对编程工 ...

  5. SQL select关联表查询 统计另一个表合计

    db_order 是记录订单的,  一个订单一条记录.(oid, 运费, 实收金额, 产品KEY.......) db_soid  是记录出售商品的 (id, 商品名称, 售价, 数量, 成本, 标识 ...

  6. 领域驱动设计(DDD):DDD落地问题和一些解决方法

    欢迎继续关注本系列文章,下面我们继续讲解下DDD在实战落地时候,会具体碰到哪些问题,以及解决的方式有哪些. DDD 是一种思想,主要知道我们方向,具体如何做,需要我们根据业务场景具体问题具体分析. 充 ...

  7. js详细讲解放大镜的实现

    实现放大镜的整体思路 1.当鼠标放在图片上的时候,出现蒙层. 2.出现蒙层,让鼠标在蒙层中心 3.限制蒙层移动的范围 4.放大镜移动 最终实现的效果 鼠标放上去的时候,出现一个蒙层. 蒙层的移动范围只 ...

  8. HTML一键打包APK工具 如何进行实名认证购买和激活

    HTML一键打包APK工具 价格表 授权时长 价格 1小时 49 1天 99 1个月 199 1个季度 399 半年 599 1年 799 付费版功能 功能点 免费版 付费版 去除广告信息 × √ 去 ...

  9. MyBatis-Plus和PageHelper冲突导致Factory method sqlSessionFactory threw exception,并且如何分页显示全部

    springboot开始引入了mybaits-plus.后来想引入pagehelper进行分页,引入之后报错 Error starting ApplicationContext. To display ...

  10. ESS、RSS、TSS

    回归平方和 ESS,残差平方和 RSS,总体平方和 TSS 残差平方和越小,自变量与因变量之间的相关性越好 总变差(TSS):被解释变量Y的观测值与其平均值的离差平方和(总平方和)(说明 Y 的总变动 ...