SpringBoot 源码解读与自动装配原理结合Actuator讲解

news2024/12/23 18:01:30

Spring Boot 作为简化 Spring 应用开发的重要框架,能够通过“约定大于配置”的方式,使开发者无需大量的 XML 或配置类即可完成复杂的配置过程。这背后的核心机制之一就是 自动装配 (Auto-Configuration),其依赖 Spring 的 依赖注入 (DI) 和 注解驱动 (Annotation-Driven) 机制。

通过 Spring Boot Actuator,开发者能够轻松地了解 Spring Boot 自动装配的状态和行为,从而进一步优化应用的性能和可维护性。在自动装配的调试过程中,autoconfig 端点是一个强大的工具,能够快速识别哪些组件被自动配置,并帮助开发者找到可能的配置问题。


1. Spring Boot 自动装配概述

Spring Boot 自动装配的核心功能在于它能够根据应用的类路径(Classpath)中的依赖、配置文件、以及 Java 类的注解自动配置相关 Bean。这种方式极大简化了开发者的配置负担,使应用程序能够快速启动并运行。

1.1 自动装配核心组件

  • @EnableAutoConfiguration: Spring Boot 自动装配的核心注解,它告诉 Spring Boot 根据项目依赖自动配置 Bean。
  • META-INF/spring.factories: 这是 Spring Boot 用来注册自动配置类的配置文件,它包含了需要在启动时加载的自动配置类的列表。
  • SpringFactoriesLoader: Spring 用于加载 spring.factories 中定义的类。

2. 自动装配注解 @EnableAutoConfiguration 解读

@EnableAutoConfiguration 是 Spring Boot 自动装配的入口,它用于启用自动配置功能。我们可以看到,Spring Boot 主类上通常会使用 @SpringBootApplication,而这个注解实际上是组合了 @EnableAutoConfiguration@ComponentScan@Configuration 三个注解。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

从源码可以看出,@EnableAutoConfiguration 通过 @Import 注解引入了 AutoConfigurationImportSelector,它负责加载 spring.factories 中的自动配置类。

2.1 AutoConfigurationImportSelector 解析

AutoConfigurationImportSelector 的核心方法 selectImports 会调用 SpringFactoriesLoader.loadFactoryNamesMETA-INF/spring.factories 中加载自动配置类。这些类是通过 @Conditional 注解进行条件注册的。

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    List<String> configurations = getCandidateConfigurations(annotationMetadata, null);
    return StringUtils.toStringArray(configurations);
}

2.2 META-INF/spring.factories 文件

spring.factories 是一个重要的配置文件,它包含了大量的键值对,其中最关键的部分是自动配置类的列表:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
...

Spring Boot 启动时会根据类路径中的依赖和配置动态地选择这些自动配置类。


3. 自动装配原理分析

3.1 自动装配加载流程

从启动到加载自动配置类的过程可以分为以下几个步骤:

  1. Spring Boot 启动: SpringApplication.run() 是 Spring Boot 启动的入口。
  2. @EnableAutoConfiguration: 启动时,Spring Boot 扫描主类中的 @EnableAutoConfiguration 注解。
  3. 加载自动配置类: 通过 AutoConfigurationImportSelector 调用 SpringFactoriesLoader 来加载自动配置类。
  4. 条件装配: 加载的自动配置类使用 @Conditional 注解来决定是否装配相关 Bean。
时序图:自动装配流程

在这里插入图片描述

3.2 条件装配(@Conditional)

@Conditional 注解是 Spring Boot 自动装配的核心条件。不同的自动配置类会通过一系列条件注解来决定是否装配对应的 Bean。例如:

  • @ConditionalOnClass: 检查某个类是否存在于类路径中。
  • @ConditionalOnMissingBean: 检查某个 Bean 是否尚未被定义。
  • @ConditionalOnProperty: 检查某个配置属性是否被设置。
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.enabled", matchIfMissing = true)
public class DataSourceAutoConfiguration {
    // DataSource bean definition
}

4. 深入解析 Spring Boot 中的自动装配类

Spring Boot 提供了大量的自动装配类来帮助开发者减少配置负担。以下是几个常见的自动配置类的分析:

4.1 数据源自动配置类 DataSourceAutoConfiguration

DataSourceAutoConfiguration 是 Spring Boot 中的一个核心自动配置类,它负责根据配置文件中的数据源属性来配置 DataSource Bean。通过 @ConditionalOnClass 确保类路径中有 DataSource,并通过 @ConditionalOnProperty 检查相关配置是否启用。

@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

4.2 Web 自动配置类 DispatcherServletAutoConfiguration

DispatcherServletAutoConfiguration 自动配置类负责初始化 DispatcherServlet,这是 Spring MVC 的核心组件。它的存在简化了 Web 应用的配置过程。

@Configuration
@ConditionalOnClass({ DispatcherServlet.class, Servlet.class })
public class DispatcherServletAutoConfiguration {

    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet();
    }

    @Bean
    public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(dispatcherServlet, "/");
        registration.setName("dispatcherServlet");
        return registration;
    }
}

5. 自动装配的优缺点

5.1 优点

  • 简化配置: 自动装配使开发者无需编写大量的 XML 配置文件或 Java 配置类。
  • 按需装配: 通过条件注解,自动装配能够根据运行时的环境动态选择装配哪些 Bean。
  • 提高开发效率: 开发者可以专注于业务逻辑,而不是复杂的配置。

5.2 缺点

  • 可见性降低: 自动装配降低了配置的透明性,可能导致开发者不清楚哪些 Bean 被装配了。
  • 配置冲突: 当多个自动配置类同时满足条件时,可能会发生 Bean 的覆盖或冲突。

6. 如何自定义自动装配

6.1 自定义自动配置类

开发者可以通过实现自定义的自动配置类来扩展 Spring Boot 的功能。一个典型的步骤如下:

  1. 编写自动配置类: 创建一个类并使用 @Configuration@Conditional 注解。
  2. 注册到 spring.factories: 在 META-INF/spring.factories 文件中声明自定义的自动配置类。
@Configuration
@ConditionalOnClass(MyService.class)
public class MyAutoConfiguration {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyAutoConfiguration


7. 监控与调试自动装配

Spring Boot 提供了几种方式来监控和调试自动装配的行为。

7.1 查看自动装配报告

通过在 application.properties 中启用调试模式,Spring Boot 会输出详细的自动装配报告,帮助开发者了解哪些配置类被启用了,哪些被跳过了。

debug=true

7.2 使用 Actuator 进行监控

Spring Boot Actuator 是 Spring Boot 中的一个子模块,专门用于提供应用的健康监控、诊断和度量相关的功能。通过它,开发者可以方便地查看应用的健康状态、监控应用的各项指标、甚至直接与应用进行交互。在自动装配和依赖注入的场景中,Actuator 提供了非常重要的辅助功能,帮助开发者了解自动配置的具体内容以及各个组件的使用情况。

7.2.1 Actuator 的基本概念

Spring Boot Actuator 提供了一系列的 端点,这些端点允许开发者在运行时检查和监控应用的内部状态。典型的 Actuator 端点包括:

  • /actuator/health:显示应用的健康状态。
  • /actuator/metrics:显示应用的各种度量信息。
  • /actuator/loggers:调整应用的日志级别。
  • /actuator/beans:显示所有 Bean 的列表以及它们的依赖关系。
  • /actuator/env:显示应用的环境信息,包括配置属性。
  • /actuator/autoconfig:显示当前启用的自动配置类,帮助开发者了解 Spring Boot 自动装配的实际工作情况。
7.2.2 启用 Actuator

要使用 Actuator,首先需要在 pom.xml 中添加相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

此外,还需要在 application.propertiesapplication.yml 中配置哪些 Actuator 端点可用,例如:

management:
  endpoints:
    web:
      exposure:
        include: "health,info,beans,metrics,autoconfig"

这将公开 healthinfobeansmetricsautoconfig 这些端点。

7.2.3 autoconfig 端点的作用

autoconfig 端点是 Actuator 提供的一个非常有用的工具,它显示了应用中所有 已启用未启用 的自动配置类。这对于调试自动装配机制特别有帮助。例如,当某个组件没有按预期配置时,开发者可以使用这个端点查看它是否被 Spring Boot 自动配置类正确加载。

示例输出:

当你访问 /actuator/autoconfig 端点时,系统会返回一个类似于以下的 JSON 响应:

{
  "positiveMatches": {
    "DataSourceAutoConfiguration": {
      "condition": [
        "DataSource.class found on classpath",
        "a single DataSource bean exists in context"
      ]
    },
    "JpaRepositoriesAutoConfiguration": {
      "condition": [
        "JpaRepository found on classpath",
        "Hibernate found on classpath",
        "EntityManager available"
      ]
    }
  },
  "negativeMatches": {
    "MongoAutoConfiguration": {
      "condition": [
        "MongoTemplate bean not found"
      ]
    }
  }
}
  • positiveMatches:表示哪些自动配置类已启用,以及它们被启用的条件。
  • negativeMatches:表示哪些自动配置类未启用,以及它们未启用的原因。

这对于调试为什么某些 Bean 没有正确初始化或者某些自动配置类没有生效非常有用。

7.2.4 示例:电商交易系统中的应用

在一个电商交易系统中,可能会用到多种数据源和缓存机制,比如 Redis、MySQL 等。通过 autoconfig 端点,可以快速查看哪些自动配置生效。

management:
  endpoints:
    web:
      exposure:
        include: "autoconfig"

启动应用后,访问 /actuator/autoconfig

{
  "positiveMatches": {
    "DataSourceAutoConfiguration": {
      "condition": [
        "DataSource.class found on classpath",
        "a single DataSource bean exists in context"
      ]
    },
    "RedisAutoConfiguration": {
      "condition": [
        "RedisConnectionFactory found",
        "RedisTemplate bean exists"
      ]
    }
  },
  "negativeMatches": {
    "MongoAutoConfiguration": {
      "condition": [
        "MongoTemplate bean not found"
      ]
    }
  }
}

根据这个输出,我们可以确认:

  • 数据源和 Redis 配置类都已正确启用,说明系统的数据库和缓存配置都有效。
  • MongoAutoConfiguration 没有启用,表示当前应用没有使用 MongoDB 相关的配置。

这种输出可以帮助开发者快速验证自动装配机制是否按照预期工作。

7.2.5 Actuator 结合自动配置的优势
  • 实时监控:开发者可以实时了解应用的健康状态、性能指标和配置信息,尤其是在使用自动装配的场景下,能够快速检查哪些配置被启用。
  • 调试工具:当自动配置类不按预期工作时,autoconfig 端点能帮助定位问题。开发者可以查看未启用的自动配置类,并确定需要添加哪些依赖或配置来启用它们。
  • 运维支持:Actuator 提供了大量监控和管理工具,不仅对开发者有帮助,还对运维人员有极大的支持作用。Actuator 可以与监控工具(如 Prometheus、Grafana)集成,用于生产环境的监控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI通用大模型编程需要的能力

这几天研究通过通义千问AI大模型编程&#xff0c;有三点感受&#xff0c;分享给大家。如果将来有新的感受&#xff0c;会继续分享。 1、清晰的提示词指令&#xff0c;让输出的成功率更高 2、了解点代码知识&#xff0c;虽不会写&#xff0c;但能看的懂 3、定位代码问题的能力…

数据库软题5-SQL语言

一、DDL数据定义语言 题 1-创建视图 建立视图属于DDL的知识 建立视图要用到CREATE AS CREATE View Computer-BOOK ASSELECT 图书编号、图书名称、作者、出版社、出版日期FROM 图书WHERE 图书类型计算机 WITH CHEEK OPTION&#xff1b;二、DQL数据查询语言 题1-交 查询平均…

SAP 和 Carahsoft 的调查范围扩大到与近 100 家机构

美国司法部正在扩大对德国软件公司SAP和经销商Carahsoft的价格操纵调查&#xff0c;涉及近100个政府机构。这项调查最初集中在两家公司是否在2014年以来向美国国防部和其他政府部门收取过高费用&#xff0c;涉及金额超过20亿美元。最新的法院文件显示&#xff0c;调查范围已扩展…

HTTPS协议详解:从原理到流程,全面解析安全传输的奥秘

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

精准农业中遥感技术应用(六)- 作物长势分析和展示

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、领域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

Linux之实战命令23:lsattr应用实例(五十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

解锁中英互译新工具,4款翻译助手带你畅游语言世界。

在现在的全球化的大背景下&#xff0c;中英互译工具显得十分的重要&#xff0c;我们无论是跨文化学习、工作还是生活旅行&#xff0c;都离不开有效的中英互译。今天我们就来说说几款高效的中英互译工具&#xff0c;希望它们能够在生活中给大家带来帮助。 1、中英在线翻译大师 …

Vortex GPGPU的github流程跑通与功能模块波形探索(二)

文章目录 前言一、环境配置和debugging.md文档1.1 调试 Vortex GPU1.1.1测试 RTL 或模拟器 GPU 驱动的更改1.1.2 SimX 调试1.1.3 RTL 调试1.1.4 FPGA 调试1.1.5 分析 Vortex 跟踪日志 二、跑出波形文件和日志文件总结 前言 昨天另辟蹊径地去探索了子模块的波形仿真&#xff0c…

读数据湖仓05数据需要的层次

1. 业务价值 1.1. 技术和商业在这个世界上是相互交织的 1.1.1. 基础数据在商业和技术应用中是不可或缺的 1.2. 技术的存在是为了推动商业的目标和进步&#xff0c;并由企业出资支持 1.2.1. 当技术推动商业发展时&#xff0c;商业会蓬勃发展&#xff0c;技术也会随之繁荣 1.…

Megabit兆比特10月比特币激增做好准备-最新加密货币新闻

Kaiko Research最近的分析表明&#xff0c;交易员正在积极为潜在的强劲表现做好准备特币(BTC)比今年十月。目前&#xff0c;BTC的交易价格为60800美元&#xff0c;在测试了60000美元的支撑位后&#xff0c;最近上涨了800美元。Megabit兆比特自成立以来,Megabit凭借用户友好的界…

初识Linux以及Linux的基本命令

千呼万唤始出来&#xff0c;Linux系列的文章从今天起开始不定期更新&#xff0c;闲话少叙&#xff0c;我们直接进入正题 目录 初识Linux 前置知识点 什么是路径&#xff1f; 什么是目录&#xff1f; 什么是文件&#xff1f; Linux的基本命令 Linux中的复制粘贴 创建文件…

数据仓库的建设——从数据到知识的桥梁

数据仓库的建设——从数据到知识的桥梁 前言数据仓库的建设 前言 企业每天都在产生海量的数据&#xff0c;这些数据就像无数散落的珍珠&#xff0c;看似杂乱无章&#xff0c;但每一颗都蕴含着潜在的价值。而数据仓库&#xff0c;就是那根将珍珠串起来的线&#xff0c;它能够把…

【AIGC】2020-NIPS-去噪扩散概率模型

2020-NIPS-Denoising Diffusion Probabilistic Models 去噪扩散概率模型摘要1. 引言2. 背景3. 扩散模型和去噪自动编码器3.1 正向过程和 L T L_{T} LT​3.2 逆过程与 L 1 : T − 1 L_{1:T-1} L1:T−1​3.3 数据缩放、逆过程解码器和 L 0 L_{0} L0​3.4 简化的训练目标 4. 实…

FreeRTOS篇7:队列

一.什么是队列 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任 务间传递信息。 为什么不使用全局变量&#xff1f; 如果使用全局变量&#xff0c;兔子&#xff08;任务1&#xff09;修改了变量 a &#xff0c;…

基于Arduino的宠物食物分配器

创作本文的初衷是本人的一个养宠物的梦想&#xff08;因为家里人对宠物过敏&#xff0c;因此养宠物的action一直没有落实&#xff09;&#xff0c;但是梦想总是要有的哈哈哈哈哈。上周正好是和一个很好的朋友见面&#xff0c;聊到了养宠物的事情&#xff0c;她大概是讲到了喂宠…

Redis: Sentinel工作原理和故障迁移流程

Sentinel 哨兵几个核心概念 1 ) 定时任务 Sentinel 它是如何工作的&#xff0c;是如何感知到其他的 Sentinel 节点以及 Master/Slave节点的就是通过它的一系列定时任务来做到的&#xff0c;它内部有三个定时任务 第一个就是每一秒每个 Sentinel 对其他 Sentinel 和 Redis 节点…

浏览器 F12 application 应用程序面板

在大多数现代浏览器中&#xff0c;按下 F12 键会打开开发者工具&#xff08;Developer Tools&#xff09;&#xff0c;这是一个为开发者设计的强大工具集&#xff0c;用于调试网页和应用。在开发者工具中&#xff0c;“Application”&#xff08;应用程序&#xff09;面板提供了…

Hystrix学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

Stable Diffusion绘画 | 来训练属于自己的模型:LoRA模型验收

我们每次训练出来的模型&#xff0c;一般都会生成 20-30 个&#xff0c;至于哪个模型符合要求&#xff0c;较为理想呢&#xff1f; 接下来需要对每个 LoRA模型 进行逐一对比测试。 为了测试模型的泛化性&#xff0c;可选择使用一些较为特殊的提示词&#xff0c;看看各个模型对…

运动耳机哪个牌子的好?5大质量不凡的运动耳机测评力荐!

在快节奏的生活中&#xff0c;无论是晨跑、健身还是户外探险&#xff0c;音乐都成了许多人不可或缺的陪伴。运动耳机&#xff0c;作为一种专为运动场景设计的音频设备&#xff0c;旨在提供高质量音频体验的同时&#xff0c;保证佩戴的舒适度和运动的安全性。 &#xff08;上图为…