一、SpringBoot简介
(1)SpringBoot是什么
SpringBoot是Spring框架对“约定优先于配置”理论的最佳实践的产物。它是一个脚手架工具:用于快捷构建一个标准的Spring应用程序。从本质上来说,Spring Boot就是Spring,它帮助你自己去做了一些Spring Bean配置。这样你就不用再写这些样板配置,从而专注于应用程序的逻辑。
(2)SpringBoot由哪些部分组成
SpringBoot为Spring应用带入了很多魔法,其中最重要的是下面的四个核心。
- 自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。
- 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
- 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序, 无需传统项目构建。
- Actuator:让你能够深入运行中的Spring Boot应用程序,查看运行时的状态、数据。
二、自动配置
(1)自动配置的含义和用处
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程。在启动的过程基于classpath中出现的类、application.properties、环境上下文中出现的一些配置,决定Spring配置应该用哪个,不该用哪个。
举例:
- Spring的JdbcTemplate是不是在Classpath里?如果是,并且有DataSource的Bean,则
自动配置一个JdbcTemplate的Bean。
- Thymeleaf是不是在Classpath里?如果是,则配置Thymeleaf的模板解析器、视图解析器以
及模板引擎。
-
Spring Security是不是在Classpath里?如果是,则进行一个非常基本的Web安全设置。
每当应用程序启动的时候,Spring Boot的自动配置都要做将近200个这样的决定,涵盖安全、
集成、持久化、Web开发等诸多方面。所有这些自动配置就是为了尽量不让开发者自己写配置。
(2)自动配置的实现原理
(所有依赖的类代码均在:spring-boot-autoconfiguration jar包中)
自动配置的具体实现原理如下:
自动配置主要由两部组成:加载和生效。
自动配置类的加载
首先看@SpringBootApplication
其中@EnableAutoConfiguration表明,启动Spring Boot程序时,默认开启了自动配置的支持。进一步查看此注解:
此注解的关键功能由类AutoConfigurationImportSelector实现。
selectImports ——> getAutoConfigurationEntry() ——> getCandidateConfigurations() 通过SpringFactoriesLoader.loadFactoryNames扫描所有具有META-INF/spring.factories的jar包,然后读取文件中EnableAutoConfiguration对应的所有的全限定名列表,并加载。
(spring.factories内部是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔 )而,spring-boot-autoconfigure包下的此文件中对应的类都会在spring-boot启动时被自动加载到Spring容器中。
随着SpringApplication.run()方法的进行,自动配置类此时已经都被加载到容器中,等待下一步的处理。
自动配置类的生效
每一个XxxAutoConfiguration自动配置类都是在一定条件下才会生效,通常以注解的形式体现,常见的条件注解有以下几项:
-
@ConditionalOnBean:当容器里有指定的bean的条件下。
-
@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。
-
@ConditionalOnClass:当类路径下有指定类的条件下。
-
@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。
-
@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。
自动配置的举例
解读RedisAutoConfiguration自动配置类
@Configuration表明它是一个配置类
@ConditionalOnClass表示classpath下有RedisOperations接口的情况下生效
@EnableConfigurationProperties表明开启配置属性。而后边的RedisProperties是习惯优于配置的体现,即系统默认属性。@ConfigurationProperties的作用是绑定配置文件的属性到对应的bean上,而前面的EnableConfigurationProperties负责把这个已经绑定了属性的的bean注入到spring容器中。
图片说明:

https://afoo.me/posts/2015-07-09-how-spring-boot-works.html
一句话总结就是:
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
原文链接:https://blog.csdn.net/u014745069/article/details/83820511
(3)如何观察自动配置的运行结果
在启动时,添加命令“–debug” 后会在控制台打印输出相关的数据,这些数据是由ConditionEvaluationReportLoggingListener提供的,输出类别为:
Positive matches(匹配到的)
Negative matches (没有匹配到的)
Exclusions (排除掉的)
Unconditional classes (无条件配置的)
(4)如何实现自己的自动配置
三个步骤:
- 编写Java Config : @Configuration
- 添加条件注解:@Conditional
- 定位自动配置:META-INF/spring.factories
三、起步依赖
Starter Dependencies
- 面向功能
- 一站获得所有相关依赖,不再复制粘贴
(1)起步依赖的相关原理
起步依赖的原理其实主要是Maven的依赖传递,本质上是一个Maven项目对象模型(POM)。在spring-boot-starter-dependencies 这样一个依赖管理库中已经帮我们定义好了很多坐标的版本、依赖管理、插件管理。
(2)起步依赖是如何生效的
当在maven中定义了依赖(dependencyManagement)之后,此时借助于自动配置,这些依赖就会转换为配置而生效。 当我们需要为系统引入一个功能时,不需要自己去找需要的相关包依赖,在起步依赖中定义了对其他库的传递依赖,这些东西加起来就支持了这个功能。我们不需要指定版本号,起步依赖本身的版本是由正在使用的Spring Boot的版本来决定的,而起步依赖则会决定它们引入的传递依赖的版本。(所有的依赖都经过了Spring Boot足够的测试,确保引入的全部依赖都能相互兼容。)
观察依赖树的情况:
- mvn dependency:tree
(3)定制自己的起步依赖
命名方式
xxx-spring-boot-autoconfigure
xxx-spring-boot-starter
四、Spring Boot的配置加载机制
(1)外化配置加载顺序
- 开启 DevTools 时,~/.spring-boot-devtools.properties
- 测试类上的 @TestPropertySource 注解
- @SpringBootTest#properties 属性
- 命令⾏参数( --server.port=9000 )
- SPRING_APPLICATION_JSON 中的属性
- ServletConfig 初始化参数
- ServletContext 初始化参数
- java:comp/env 中的 JNDI 属性
- System.getProperties()
- 操作系统环境变量
- random.* 涉及到的 RandomValuePropertySource
- jar 包外部的 application-{profifile}.properties 或 .yml
- jar 包内部的 application-{profifile}.properties 或 .yml
- jar 包外部的 application.properties 或 .yml
- jar 包内部的 application.properties 或 .yml
- @Configuration 类上的 @PropertySource
- SpringApplication.setDefaultProperties() 设置的默认属性
(2)application.properties的设置
默认加载路径
- ./config
- ./
- CLASSPATH 中的 /config
- CLASSPATH 中的 /
修改名字或路径
- spring.confifig.name
- spring.confifig.location
- spring.confifig.additional-location
(3)PropertySource
添加PropertySource
< context:property-placeholder >
(Spring 的XML配置方式,实际是注册了一个PropertySourcesPlaceholderConfigurer<spring v3.1之后提供的>,之前版本是PropertyPlaceholderConfigurer)
在Spring v3.1版本之后,关于Java Config更多的是使用@PropertySource 和 @PropertySources注解在类上使用。
在Spring Boot中,使用@ConfigurationProperties注解
- 可以将属性绑定到结构化对象上
- 支持Relaxed Binding
- 支持安全的类型转换
- @EnableConfigurationProperties
定制PropertySource
实现步骤
-
实现PropertySource
-
从Environment取得PropertySource
-
将自己的PropertySource添加到合适的位置
切入位置
-
EnvironmentPostProcessor
-
BeanFactoryPostProcessor
五、Actuator
(1)Actuator是什么?有什么用
Actuator是Spring Boot提供给我们监控和管理应用程序的工具。它能让我们深入应用程序,了解它的行为,检查它的健康状况,甚至触发一些操作来影响应用程序。
(2)如何引入和使用Actuator
引入actuator的起步依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Endpoint管理
开启 Endpoint
- management.endpoint..enabled=true
- management.endpoints.enabled-by-default=false
暴露 Endpoint
-
management.endpoints.jmx.exposure.exclude=
-
management.endpoints.jmx.exposure.include=*
-
management.endpoints.web.exposure.exclude=
-
management.endpoints.web.exposure.include=info, health
访问方式
HTTP
/actuator/
端口与路径
- management.server.address=
- management.server.port=
- management.endpoints.web.base-path=/actuator
- management.endpoints.web.path-mapping.=路径
JMX
远程Shell
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>
因在SpringBoot2.x 版本中已不可用,故不再赘述
常用的Endpoint
Metrics端点
(3)动手定制自己的Headlth Indicator
实现机制
- 通过HealthIndicatorRegistry收集信息
- HealthIndicator 实现具体检查逻辑
配置项
-
management.health.defaults.enabled=true|false
-
management.health..enabled=true
-
management.endpoint.health.show-details=never|when
authorized|always
SpringBoot自带的Health Indicator
自定义实现
- 实现 HealthIndicator 接⼝(或者extend AbstractHealthIndicator)
- 根据⾃定义检查逻辑返回对应 Health 状态
- Health 中包含状态和详细描述信息
本文参考资料
- 《Spring Boot实战》Craig Walls著,丁雪丰译
- 《玩转Spring 全家桶》 丁雪丰课程 https://time.geekbang.org/course/intro/156
- https://blog.csdn.net/u014745069/article/details/83820511
- https://blog.csdn.net/Dongguabai/article/details/80865599