当前位置: 首页 > news >正文

SpringBoot自动装配原理深度解析

目录

前言

一、什么是自动装配?

二、自动装配的核心机制

1. @SpringBootApplication注解

2.总结与比喻

三.@SpringBootConfiguration

四.@ComponentScan

五.@EnableAutoConfiguration

1.@Import()注解

​编辑2. AutoConfigurationImportSelector的工作原理

3.spring.factories文件

4.条件化装配

5.自动装配流程总结

总结


前言

在使用Spring Boot进行开发时,我们经常会惊叹于它的便捷性——只需添加一个starter依赖,进行少量配置甚至零配置,就能快速集成一个功能模块。这背后的秘密正是Spring Boot的自动装配机制。本文将深入探讨Spring Boot自动装配的原理,帮助大家更好地理解这一强大功能。


一、什么是自动装配?

自动装配是Spring Boot的核心特性之一,它根据类路径下的jar包、定义的bean以及各种配置属性,自动配置Spring应用所需的组件。这意味着开发者不需要编写大量的XML配置或Java配置,Spring Boot会智能地推断并配置所需的bean。

二、自动装配的核心机制

1. @SpringBootApplication注解

        (1).一切从@SpringBootApplication注解开始,这是Spring Boot应用的入口点。这个注解实际上是一个组合注解,包含了三个核心注解。

        (2).按住Ctrl键,鼠标左键单击我们可以进入@SpringBootApplication注解,在这里面我们可以看到三个核心注解,如下如所示:

2.总结与比喻

你可以把一个Spring Boot应用想象成一家餐厅:

  • @SpringBootConfiguration:就像餐厅的经理本人,他本身也是员工之一(配置类本身也是一个Bean),并且他负责招聘一些核心员工(通过@Bean方法定义Bean)。

  • @ComponentScan:就像经理在餐厅内部巡视,发现并正式雇佣所有穿着公司制服(带有@Component等注解)的员工(你写的Service、Controller等自定义类)。

  • @EnableAutoConfiguration:就像经理打电话给第三方供应商(引入的starterjar包),说:“我这儿是餐厅,需要厨房设备、餐具、食材”。供应商会根据餐厅的类型(项目环境)自动送来最合适的设备(自动配置Bean,如DataSource、MVC配置)。经理不需要关心这些设备的具体品牌和型号,供应商会智能匹配。

最终,经理(@SpringBootConfiguration)、内部员工(@ComponentScan)和供应商送来的设备(@EnableAutoConfiguration)全部就位,餐厅(Spring应用)就可以顺利开业运行了!

接下来我们来认识一下这三个注解具体都干了什么!

三.@SpringBootConfiguration

  • 本质:它是一个特殊的 @Configuration

  • 作用标识当前类是一个“配置类”

  • 细节

    • 被它标注的类(通常是主类)会被Spring容器认为是提供一个Bean定义(@Bean 方法)的源头。

    • Spring容器会处理这个类中的 @Bean 注解方法,将这些方法返回的对象注册到应用上下文中,成为Spring管理的Bean。

    • 它可以看作是 @Configuration 的一个别名,但专门用于Spring Boot应用,是Spring Boot框架的语义化体现。

简单来说:它告诉Spring,“我这个类是用来做配置的,请来看看我里面定义了哪些Bean(@Bean 方法)”。

四.@ComponentScan

  • 作用启动包扫描,自动发现和注册组件(Beans)。

  • 扫描范围:默认情况下,它会从标注了@ComponentScan的类所在的包及其所有子包开始扫描。

  • 扫描目标:它会查找带有 @Component@Service@Repository@Controller@RestController@Configuration 等注解的类,并将它们自动注册到Spring的应用上下文(ApplicationContext)中,成为容器管理的Bean。

五.@EnableAutoConfiguration

        @EnableAutoConfiguration的作用就是开启自动装配,但是想要了解它,我们还需要继续往下看!

1.@Import()注解

        当我们打开@EnableAutoConfiguration我们会发现一个新的注解@Import():

        @Import注解 @Enable底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中。 而@Import提供4中用法:

        ① 导入Bean

        ② 导入配置类

        ③ 导入 ImportSelector 实现类。一般用于加载配置文件中的类

        ④ 导入 ImportBeanDefinitionRegistrar 实现类。

   所以在这里我们可以看到 @EnableAutoConfiguration注解本身又引入了@Import(AutoConfigurationImportSelector.class),这个类负责加载自动配置类。


2. AutoConfigurationImportSelector的工作原理

        (1).AutoConfigurationImportSelector使用SpringFactoriesLoader机制,从META-INF/spring.factories文件中加载自动配置类。这些配置类通常位于spring-boot-autoconfigure包中。

        (2).SpringFactoriesLoader 是 Spring 框架内部提供的一种通用的工厂加载机制。它的核心思想是从类路径下的多个 JAR 包中的 META-INF/spring.factories 文件里,加载并实例化给定接口的实现类或配置类。

        (3)关键方法:

大家可以自行跟着图片指示操作,我也将带着大家一起去看看

3.spring.factories文件

        在spring-boot-autoconfigure项目的META-INF目录下,有一个spring.factories文件(也就是上图展示的文件),其中定义了大量的自动配置类,@EnableAutoConfiguration下的@improt()收到这些信息就会开始导入这些类。

4.条件化装配

        自动配置类不会全部生效,它们使用@Conditional系列注解实现条件化装配,只有在特定条件满足时才会生效:

  • @ConditionalOnClass:类路径下存在指定的类时生效

  • @ConditionalOnMissingBean:容器中不存在指定Bean时生效

  • @ConditionalOnProperty:指定的属性有特定值时生效

  • @ConditionalOnWebApplication:是Web应用时生效

5.自动装配流程总结

  1. Spring Boot启动时加载@SpringBootApplication注解

  2. 该注解引入@EnableAutoConfiguration,进而触发自动配置机制

  3. AutoConfigurationImportSelector读取META-INF/spring.factories中的自动配置类

  4. 过滤并排序这些自动配置类

  5. 根据条件注解判断哪些配置类应该生效

  6. 生效的配置类向容器中添加所需的Bean


总结

Spring Boot的自动装配机制通过条件化配置和约定优于配置的原则,极大地简化了Spring应用的开发流程。理解这一原理不仅有助于我们更好地使用Spring Boot,还能在遇到问题时快速定位和解决。

通过深入分析自动装配的过程,我们可以看到Spring Boot如何智能地根据项目环境自动配置组件,这正是Spring Boot"开箱即用"特性的核心技术基础。

希望本文能帮助大家更好地理解Spring Boot自动装配的原理,在实际开发中更加得心应手!

http://www.dtcms.com/a/347489.html

相关文章:

  • 【LeetCode 热题 100】300. 最长递增子序列——(解法一)记忆化搜索
  • mmap映射物理内存之四内核cache同步
  • 后台管理系统-14-vue3之tag标签页的实现
  • JEI(Journal of Electronic lmaging)SCI四区期刊
  • TypeScript的接口 (Interfaces)讲解
  • Python 版本与 package 版本兼容性检查方法
  • 定时任务——ElasticJob原理
  • ChipCamp探索系列 -- 4. Intel CPU的十八代微架构
  • 【背诵2025】测试
  • 数据结构与算法——树和二叉树
  • 【科研绘图系列】浮游植物的溶解性有机碳与初级生产力的关系
  • 大麦APP抢票
  • 数据结构 之 【AVL树的简介与部分实现】(部分实现只涉及AVL树的插入问题,包括单旋((右单旋、左单旋))、双旋(左右单旋、右左单旋)等操作)
  • 国家自然科学基金(国自然基金)申请技巧详解
  • materials studio中的两种坐标系
  • 基于RISC-V架构的国产MCU在eVTOL领域的应用研究与挑战分析
  • leetcode(同向双指针 滑动窗口)209.长度最小的子数组 713.乘积小于K的子数组 3.无重复字符的最长子串
  • 随机森林1
  • 12 SQL进阶-锁(8.20)
  • 我从零开始学习C语言(14)- 基本类型 PART1
  • FRP 内网穿透全流程部署指南 (Windows/Linux)
  • 不必使用 == 和 ===,更严格的相等性判断 API 来了
  • DFT计算入门(materials studio)---Ni金属表面,几何优化
  • 求职推荐大数据可视化平台招聘系统 Vue+Flask python爬虫 前后端分离
  • 【KO】前端面试四
  • leetcode26:删除有序数组中的重复项Ⅰ(快慢指针解法)
  • 【知识】Elsevier论文接收后的后续流程
  • 【数据结构】跳表的概率模型详解与其 C 代码实现
  • 如何用Redis作为消息队列
  • PyQt6 进阶篇:构建现代化、功能强大的桌面应用