Spring Boot核心原理实现解读

本文深入剖析SpringBoot的四大核心机制:自动配置、起步依赖、配置加载机制与Actuator,揭示其工作原理与实践方法,助力开发者高效构建Spring应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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容器中。

在这里插入图片描述

图片说明:

img

​ 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)外化配置加载顺序

  1. 开启 DevTools 时,~/.spring-boot-devtools.properties
  2. 测试类上的 @TestPropertySource 注解
  3. @SpringBootTest#properties 属性
  4. 命令⾏参数( --server.port=9000 )
  5. SPRING_APPLICATION_JSON 中的属性
  6. ServletConfig 初始化参数
  7. ServletContext 初始化参数
  8. java:comp/env 中的 JNDI 属性
  9. System.getProperties()
  10. 操作系统环境变量
  11. random.* 涉及到的 RandomValuePropertySource
  12. jar 包外部的 application-{profifile}.properties 或 .yml
  13. jar 包内部的 application-{profifile}.properties 或 .yml
  14. jar 包外部的 application.properties 或 .yml
  15. jar 包内部的 application.properties 或 .yml
  16. @Configuration 类上的 @PropertySource
  17. 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

在这里插入图片描述

自定义实现

  1. 实现 HealthIndicator 接⼝(或者extend AbstractHealthIndicator)
  2. 根据⾃定义检查逻辑返回对应 Health 状态
  3. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值