【SpringBoot】深入剖析 Spring Boot 自动装配原理(附源码与实战)

深入剖析 Spring Boot 自动装配原理(附源码与实战)

Spring Boot 的**自动装配(Auto Configuration)是其核心特性之一,使得开发者无需手动配置复杂的 Bean,即可快速构建应用。但Spring Boot 是如何实现自动装配的?它的底层原理是什么?我们又该如何自定义自动装配?**本文将从源码入手,深入剖析 Spring Boot 的自动装配原理,并通过代码实战加深理解。


1. 什么是自动装配?

在传统的 Spring 项目中,我们需要手动配置 Bean,例如 XML 或 Java 配置:

@Bean
public DataSource dataSource() {
    return new HikariDataSource();
}

而在 Spring Boot 中,这些 Bean 可以不写,Spring Boot 会自动装配合适的 Bean。例如,添加 spring-boot-starter-data-jpa 依赖后,Spring Boot 会自动配置 DataSource但我们从未在代码中显式定义它!


2. 自动装配的底层原理

Spring Boot 的自动装配基于**@EnableAutoConfiguration**,该注解的核心逻辑如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class) // 导入自动装配选择器
public @interface EnableAutoConfiguration {
}

2.1 @EnableAutoConfiguration 做了什么?

  1. @AutoConfigurationPackage:自动扫描并注册包路径下的组件。
  2. @Import(AutoConfigurationImportSelector.class):加载所有自动配置类。

其中,AutoConfigurationImportSelector 是 Spring Boot 自动装配的核心,负责加载 META-INF/spring.factories 里的自动配置类。


3. Spring Boot 如何加载自动配置类?

3.1 AutoConfigurationImportSelector 源码分析

AutoConfigurationImportSelector 通过 getAutoConfigurationEntry() 方法加载所有自动配置类:

@Override
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata metadata, AnnotationMetadata annotationMetadata) {
    List<String> configurations = getCandidateConfigurations(annotationMetadata, metadata);
    configurations = removeDuplicates(configurations);
    return new AutoConfigurationEntry(configurations, exclusions);
}

其中,getCandidateConfigurations() 方法会加载 spring.factories 文件:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AutoConfigurationMetadata autoConfigurationMetadata) {
    return SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
}

3.2 spring.factories 文件

Spring Boot 的 spring-boot-autoconfigure.jar 包含 META-INF/spring.factories,里面定义了所有的自动装配类。例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

这意味着:Spring Boot 会自动加载 DataSourceAutoConfigurationHibernateJpaAutoConfiguration 等自动配置类。


4. 代码实战:自定义自动装配

假设我们希望 Spring Boot 在项目启动时自动装配一个自定义的 HelloService,而无需手动配置 Bean,我们可以按照以下步骤实现。

4.1 定义 HelloService

首先,创建一个简单的服务类:

public class HelloService {
    public String sayHello() {
        return "Hello, Spring Boot AutoConfiguration!";
    }
}

4.2 创建自动配置类

com.example.config 包下创建 HelloServiceAutoConfiguration,使用 @Configuration@ConditionalOnMissingBean,确保仅在没有用户手动定义 HelloService 时才进行装配:

@Configuration
public class HelloServiceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public HelloService helloService() {
        return new HelloService();
    }
}

4.3 注册到 spring.factories

resources/META-INF/spring.factories 文件中,加入:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.config.HelloServiceAutoConfiguration

这样,Spring Boot 启动时,会自动加载 HelloServiceAutoConfiguration,并装配 HelloService

4.4 测试自动装配

创建 Spring Boot 启动类:

@SpringBootApplication
public class AutoConfigDemoApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(AutoConfigDemoApplication.class, args);
        HelloService helloService = context.getBean(HelloService.class);
        System.out.println(helloService.sayHello());
    }
}

运行后,输出:

Hello, Spring Boot AutoConfiguration!

这证明我们的 HelloService 已经被 Spring Boot 自动装配!


5. 自动装配的排除与自定义

5.1 排除特定的自动配置

如果不想让某些自动配置生效,可以使用 exclude

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyApplication {
}

或者在 application.properties 中排除:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

5.2 查看已加载的自动配置

Spring Boot 提供 spring-boot-actuator 依赖,可以使用 /actuator/beans 查看已加载的自动配置 Bean:

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

然后访问:

http://localhost:8080/actuator/beans

可以看到当前应用加载了哪些自动装配的 Bean。


6. 总结

  1. Spring Boot 通过 @EnableAutoConfigurationAutoConfigurationImportSelector 加载 spring.factories 中的自动配置类。
  2. 自动配置类使用 @ConditionalOnMissingBean 等注解,确保只有在必要时才进行装配。
  3. 可以自定义自动装配组件,让 Spring Boot 在启动时自动加载自定义 Bean。
  4. 可以使用 exclude 配置排除特定的自动装配类,避免不必要的 Bean 加载。

Spring Boot 的自动装配机制极大地简化了 Spring 应用的开发,同时提供了足够的扩展性,使开发者能够轻松地自定义和管理 Bean 配置。希望本文能帮助你深入理解 Spring Boot 自动装配的底层原理!🚀


📌 你学会了吗? 欢迎在评论区留言交流!🔥

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Academy】HTTP 请求走私 ------ HTTP request smuggling

HTTP 请求走私 ------ HTTP request smuggling 1. 什么是 HTTP 请求走私&#xff1f;2. HTTP 请求走私漏洞是如何产生的&#xff1f;3. 如何执行 HTTP 请求走私攻击3.1 CL.TE 漏洞3.2 TE.CL 漏洞3.3 TE.TE 行为&#xff1a;混淆 TE 标头 4. 如何识别和确认 HTTP 请求走私漏洞4.…

元脑服务器的创新应用:浪潮信息引领AI计算新时代

浪潮信息的元脑 R1 服务器现已全面支持开源框架 SGLang&#xff0c;能够在单机环境下实现 DeepSeek 671B 模型的高并发性能&#xff0c;用户并发访问量超过1000。通过对 SGLang 最新版本的深度适配&#xff0c;元脑 R1 推理服务器在运行高性能模型时&#xff0c;展现出卓越的处…

蓝桥备赛(13)- 链表和 list(下)

一、动态链表 - list (了解) new 和 delete 是非常耗时的操作 在算法比赛中&#xff0c;一般不会使使用 new 和 delete 去模拟实现一个链表。 而且STL 里面的 list 的底层就是动态实现的双向循环链表&#xff0c;增删会涉及 new 和 delete&#xff0c;效率不高&#xff0c;竞赛…

【VUE2】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…

正则表达式梳理(基于python)

正则表达式&#xff08;regular expression&#xff09;是一种针对字符串匹配查找所定义的规则模式&#xff0c;独立于语言&#xff0c;但不同语言在实现上也会存在一些细微差别&#xff0c;下面基于python对常用的相关内容进行梳理。 文章目录 一、通用常识1.通配符ps.反义 2.…

《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》

类的6个默认成员函数 构造函数 是对一个对象实例化时的初始化 例如在C语言中写的堆的时候要初始化StackInit&#xff0c;而c祖师爷写的构造函数本质上就是自动调用初始化。 构造函数默认构造函数自己写的&#xff08;符合规定的显示表达式&#xff09; 注&#xff1a;一般情况下…

使用服务器搭建无门槛ChatGPT WEB应用LobeChat

一、服务器实例配置 ‌实例选型‌ ‌推荐配置‌&#xff1a;‌2核4GB内存‌&#xff0c;保障AI推理和并发访问的流畅性‌67。‌操作系统‌&#xff1a;选择 ‌Ubuntu 22.04 LTS‌&#xff0c;适配Docker环境与LobeChat依赖库‌23。‌安全组规则‌&#xff1a;开放以下端口&…

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…

车载网络测试-DBC文件解读

目录 1 背景2 DBC结构2.1 Networks2.2 ECUs&#xff08;Electronic Control Units&#xff09;2.3 Network Nodes2.4 Message&#xff08;报文&#xff09;2.4.1 Message定义、作用、示例2.4.2 报文Attribute&#xff08;属性&#xff09;2.4.2.1 常见的报文Attributes2.4.2.2 …

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品&#xff0c;以前都是扫二维码开箱&#xff0c;有些图书馆升级了使用指纹识别。 “是否新方法比以前好&#xff1f;”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

大语言模型进化论:从达尔文到AI的启示与展望

文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…

SSM架构 +Nginx+FFmpeg实现rtsp流转hls流,在前端html上实现视频播放

序言&#xff1a; 本文介绍通过SSM架构 NginxFFmpeg实现rtsp流转hls流&#xff0c;在前端html上实现视频播放功能。此方法可用于网络摄像头RTSP视频流WEB端实时播放。&#xff08;海康和大华都可以&#xff09;&#xff0c;我使用的是海康 步骤一&#xff1a;安装软件 FFmpeg…

Hadoop管理页看不到任务的问题

这个yarn分配任务了但是为空 在$HADOOP_HOME/conf/mapred-site.xml 原来的配置文件基础之上添加&#xff1a; <property><name>mapreduce.framework.name</name><value>yarn</value></property> 重启之后就好了

腾讯云TBDS获金融信创实验室全项适配认证 打造国产化大数据平台标杆

点击蓝字⬆ 关注我们 本文共计1605字 预计阅读时长5分钟 近日&#xff0c;腾讯云大数据套件软件TBDS V5.3、数据仓库TCHouse V3.0通过金融信创生态实验室&#xff08;以下简称“实验室”&#xff09;的适配验证。 本测试基于典型金融业务场景&#xff0c;在全信创环境下&#x…

人工智能神经网络基本原理

MP 神经元数学模型 MP 模型是神经网络领域的早期模型&#xff0c;它模仿了神经元的基本结构和工作原理。 人工神经元是一个多输入、单输出的信息处理单元&#xff0c;是对生物神经元的建模。建模方式可以有很多种&#xff0c;不同的建模方式就意味着不同的人工神经元结构。 比…

WSL + 4050 部署 Deepseek-7B 蒸馏模型

操作环境&#xff1a;WSL - Oracle Linux RTX 4050 Laptop edition 渣渣笔记本实在是跑不了更大模型了&#x1f602; 整体架构 WSL 配置显卡加速环境 总体流程 安装教程&#xff1a;https://zhuanlan.zhihu.com/p/681092042 总体流程&#xff1a; 优化 WSL 系统配置&#x…

C++入门——输入输出、缺省参数

C入门——输入输出、缺省参数 一、C标准库——命名空间 std C标准库std是一个命名空间&#xff0c;全称为"standard"&#xff0c;其中包括标准模板库&#xff08;STL&#xff09;&#xff0c;输入输出系统&#xff0c;文件系统库&#xff0c;智能指针与内存管理&am…

简单的二元语言模型bigram实现

内容总结归纳自视频&#xff1a;【珍藏】从头开始用代码构建GPT - 大神Andrej Karpathy 的“神经网络从Zero到Hero 系列”之七_哔哩哔哩_bilibili 项目&#xff1a;https://github.com/karpathy/ng-video-lecture Bigram模型是基于当前Token预测下一个Token的模型。例如&#x…