Spring Boot:让你轻松掌握自动装配的奥秘

news2025/1/29 14:07:05

Spring Boot是基于Spring框架开发的一种应用框架,它通过自动装配机制,大大简化了Spring应用的开发和部署,使开发者可以更加专注于业务逻辑的实现,而无需过多关注Bean的实例化和装配过程。本文将从以下几个方面介绍Spring Boot的自动装配原理:

- 什么是自动装配
- 自动装配的核心注解
- 自动装配的实现流程
- 自动装配的条件判断
- 自动装配的优缺点

目录

一、什么是自动装配

二、自动装配的核心注解

三、自动装配的实现流程

四、自动装配的条件判断

五、自动装配的优缺点


一、什么是自动装配

自动装配是指Spring Boot根据项目中引入的依赖,自动配置相关的Bean,并将它们注册到Spring容器中,从而实现某些功能或特性。例如,如果我们在项目中引入了spring-boot-starter-web依赖,那么Spring Boot就会自动配置一个嵌入式的Tomcat服务器,一个DispatcherServlet,以及一些其他与Web开发相关的Bean。

自动装配可以简单理解为:通过注解或者一些简单的配置就能在Spring Boot的帮助下实现某块功能。

二、自动装配的核心注解

要启用Spring Boot的自动装配功能,我们需要在主程序类上添加一个核心注解:@SpringBootApplication。这个注解是一个组合注解,由以下三个注解组成:

- @SpringBootConfiguration:标注在某个类上,表示这是一个Spring Boot的配置类;
- @EnableAutoConfiguration:开启自动装配功能;
- @ComponentScan:配置扫描路径,用于加载使用注解格式定义的Bean。

其中@EnableAutoConfiguration注解又由以下两个注解组成:

- @AutoConfigurationPackage:指定了默认的包规则,就是将主程序类所在包及所有子包下的组件扫描到Spring容器中;
- @Import(AutoConfigurationImportSelector.class):通过@Import注解导入AutoConfigurationImportSelector类,然后通过该类的selectImports方法去读取META-INF/spring.factories文件中配置的组件,并按照一定的规则过滤和加载它们。

三、自动装配的实现流程

为了更清楚地理解自动装配的原理和过程,我们可以通过以下几个步骤来分析:

1. 当我们运行主程序类时,首先会创建一个SpringApplication对象,并调用其run方法来启动应用;
2. SpringApplication对象会创建一个DefaultApplicationContext对象作为应用上下文,并调用其refresh方法来初始化容器;
3. 在refresh方法中,会调用invokeBeanFactoryPostProcessors方法来执行BeanFactory后置处理器;
4. 在invokeBeanFactoryPostProcessors方法中,会调用getBeanFactoryPostProcessors方法来获取所有已注册的后置处理器,并将它们分为两类:实现了PriorityOrdered接口和Ordered接口的后置处理器,以及普通的后置处理器;
5. 然后会按照优先级顺序依次执行这两类后置处理器;
6. 在执行第一类后置处理器时,会遇到一个特殊的后置处理器:ConfigurationClassPostProcessor。这个后置处理器负责处理所有被@Configuration注解标记的配置类,并将它们解析成Bean定义注册到容器中;
7. 在执行ConfigurationClassPostProcessor时,会调用processConfigBeanDefinitions方法来处理配置类;
8. 在processConfigBeanDefinitions方法中,会创建一个ConfigurationClassParser对象来解析配置类,并调用其parse方法;
9. 在parse方法中,会遍历所有的配置类,并调用processConfigurationClass方法来处理每个配置类;
10. 在processConfigurationClass方法中,会检查配置类上是否有@Import注解,如果有,就会调用processImports方法来处理导入的类;
11. 在processImports方法中,会判断导入的类是否实现了ImportSelector接口或者ImportBeanDefinitionRegistrar接口,如果是,就会调用相应的方法来获取要导入的类名或者注册Bean定义;
12. 在这个过程中,会遇到一个特殊的ImportSelector实现类:AutoConfigurationImportSelector。这个类负责实现自动装配的核心逻辑;
13. AutoConfigurationImportSelector类会重写selectImports方法,该方法返回一个字符串数组,表示要导入的自动配置类的全限定名;
14. 在selectImports方法中,会调用getAutoConfigurationEntry方法来获取自动配置条目;
15. 在getAutoConfigurationEntry方法中,会调用getCandidateConfigurations方法来获取候选的自动配置类;
16. 在getCandidateConfigurations方法中,会调用SpringFactoriesLoader.loadFactoryNames方法来加载META-INF/spring.factories文件中配置的自动配置类名;
17. 然后会调用filterExclusions方法来过滤掉不符合条件的自动配置类,例如被@ConditionalOnClass等注解排除的类;
18. 最后会将剩余的自动配置类名返回给selectImports方法,并将它们作为Bean定义注册到容器中。

 

四、自动装配的条件判断

在自动装配的过程中,有一个重要的环节是条件判断。Spring Boot提供了一系列的@Conditional注解,用于根据不同的条件来决定是否加载某个自动配置类。这些注解包括:

- @ConditionalOnBean:当容器中存在指定Bean时,才加载该自动配置类;
- @ConditionalOnMissingBean:当容器中不存在指定Bean时,才加载该自动配置类;
- @ConditionalOnClass:当类路径中存在指定类时,才加载该自动配置类;
- @ConditionalOnMissingClass:当类路径中不存在指定类时,才加载该自动配置类;
- @ConditionalOnProperty:当配置文件中存在指定属性时,才加载该自动配置类;
- @ConditionalOnResource:当资源文件中存在指定内容时,才加载该自动配置类;
- @ConditionalOnWebApplication:当应用是一个Web应用时,才加载该自动配置类;
- @ConditionalOnNotWebApplication:当应用不是一个Web应用时,才加载该自动配置类;
- @ConditionalOnExpression:当满足SpEL表达式时,才加载该自动配置类;

这些注解可以组合使用,也可以自定义条件注解。Spring Boot会在加载自动配置类之前,检查这些注解的条件是否成立,如果不成立,则跳过该自动配置类。

五、自动装配的优缺点

Spring Boot的自动装配机制带来了很多好处,例如:

- 简化了Spring应用的开发和部署,无需编写繁琐的XML或Java配置文件;
- 提高了开发效率和质量,减少了出错和调试的可能性;
- 增强了可扩展性和灵活性,可以根据不同的场景和需求选择不同的starter和属性进行定制化;

但是,自动装配机制也有一些缺点和风险,例如:

- 增加了项目的依赖和复杂度,可能导致版本冲突或者不兼容的问题;
- 降低了项目的可控性和透明度,可能导致一些隐蔽或者意外的问题;
- 降低了项目的性能和资源利用率,可能导致一些冗余或者无用的Bean被加载到容器中;

因此,在使用Spring Boot的自动装配功能时,我们需要有一定的判断和选择,不能盲目地依赖和信任它。我们需要了解自动装配的原理和过程,以及如何通过配置文件或者代码来调整和覆盖它。我们也需要注意自动装配可能带来的问题和风险,以及如何通过测试和监控来发现和解决它们。

总之,Spring Boot的自动装配是一个强大而方便的特性,但也是一个需要谨慎而理性的特性。只有在充分理解和掌握它的基础上,才能更好地利用它,而不是被它所限制或者误导。

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

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

相关文章

计算机竞赛 基于RSSI的室内wifi定位系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 wifi室内定位系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:…

掌握这20条你将超过90%的测试员

1、不断学习 不管是“软技能”,比如公开演讲, 或者编程语言,亦或新的测试技术,成功的软件测试工程师总是会从繁忙中抽出时间来坚持学习。 2、管理你的时间 我们的时间很容易被大块的工作和不断的会议所占据,导致我们…

数据库mysql导入导出数据需要注意的问题,作者只有600~800个表的处理经验

文章目录 一、新建数据库的时候编码和排序规则尽量和原数据库完全一样二、表结构和表数据分开导入,不要同时导入Navicat导出表结构Navicat导入表结构Navicat导出表数据Navicat导入表数据 三、编码问题四、执行顺序的问题五、迁移数据大小和速度的问题六、数据库分区…

element-ui中的el-table的summary-method(合计)的使用

场景图片: 图片1: 图片2: 一:使用element中的方法 优点: 直接使用summary-method方法,直接,方便 缺点: 只是在表格下面添加了一行,如果想有多行就不行了 1:h…

成都瀚网科技:抖店如何经营?

作为热门的短视频分享平台,抖音不仅是一种娱乐工具,更是一个蕴藏着无限商机的电商平台。开店、抖音下单成为很多人的选择。那么,抖音如何开店、下单呢? 1、如何在抖音上开店和下单? 注册账号:首先&#xff…

Java调用高德地图API根据经纬度获取区县

在开发中,有时候需要根据经纬度来获取对应的区县信息,这可以通过调用高德地图的API来实现。本篇文章将介绍如何使用Java代码调用高德地图API来根据经纬度获取区县信息。 前提条件 首先,你需要注册一个高德地图开发者账号,并获取…

如何做好作品集?告诉你这7个技巧

又到了一年一度的求职季,无论你是毕业生、专业人士还是自由职业者,一个高质量的个人作品集都是你的第一块垫脚石。作品集的制作是你工作能力的缩影,也是面试官认识你的第一站。制作一个作品集需要展示你的广度、技能和经验,甚至是…

17.3 【Linux】systemctl 针对 service 类型的配置文件

17.3.1 systemctl 配置文件相关目录简介 服务的管理是通过 systemd,而 systemd 的配置文件大部分放置于/usr/lib/systemd/system/ 目录内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,建议不要修改!而要…

如何获取Ck

1. 下载via浏览器 https://viayoo.com/zh-cn/ 2.打开via浏览器, 登录美团外卖 美团网账号登录-手机美团官网 3.点击左上角的盾牌 然后点击这里 最后去我的网站粘贴就行

肽在化妆品中的应用是怎样的呢?

传统的化妆品功能原料多为化学合成或植物提取,而近几年以来明显的往生物美容和基因美容方面发展,肽类的原料和成品非常的活跃,其活性成分的小分子肽是由一定序列的多个氨基酸组成。自然界中生物体内多数生物反应和进化过程在一定程度上是由特…

(学习笔记-调度算法)内存页面置换算法

在了解内存页面置换算法前,我们得先了解 缺页异常(缺页中断)。 当 CPU 访问的页面不在物理内存中时,便会产生一个缺页中断,请求操作系统将缺页调入到物理内存。那它与一般的中断主要区别在于: 缺页中断在指令执行 [期…

netapp fas存储更换故障硬盘

在机房查看SSN的 位置示意图 SSH连接集群管理IP,使用以下命令采集日志,将输出内容保存为txt文件,发给400 使用Putty通过SSH访问设备IP 链接后,输入用户名,密码 进入命令行界面,搜集日志 ::> syst…

c++(8.24)拷贝赋值对象,匿名对象,友元,常成员和常对象,mutable关键字,运算符重载

作业&#xff1a; 实现关系运算符重载&#xff08;仅>,<,&#xff09;&#xff1a; #include <iostream>using namespace std;class Person {int a;int b;friend bool operator (const Person &L,const Person&R); public:Person(){}Person(int a,int b)…

【PostGreSQL】PostGreSQL到Oracle的数据迁移

项目需要&#xff0c;有个数据需要导入&#xff0c;拿到手一开始以为是mysql&#xff0c;结果是个PostGreSQL的数据&#xff0c;于是装数据库&#xff0c;但这个也不懂呀&#xff0c;而且本系统用的Oracle&#xff0c;于是得解决迁移转换的问题。 总结下来两个思路。 1、Postg…

七、pikachu之不安全的文件下载

文章目录 1、不安全的文件下载简介2、实战 1、不安全的文件下载简介 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c;便会向后台发送一个下载请求&#xff0c;一般这个请求会包含一个需要下载的文件名称&#xff0c;后台在收到请求后&…

【附安装包】CIMCO Edit2022安装教程

软件下载 软件&#xff1a;CIMCO Edit版本&#xff1a;2022语言&#xff1a;简体中文大小&#xff1a;251.79M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.b…

新功能:部署远程办公支持第三方授权登录

随着业务的发展和信息管理的完善&#xff0c;企业的应用系统也逐渐增多&#xff0c;每个软件系统使用各自的软件数据&#xff0c;独立的用户管理模式&#xff0c;不仅会增加部署成本&#xff0c;对于企业应用平台化管理也是不小的挑战。 对于企业而言&#xff0c;如何实现应用系…

电商平台京东平台获得京东商品描述API接口演示案例

京东商品描述API接口可以获取京东商品描述&#xff1a; 详细介绍商品的特点和功能,让消费者能够了解商品的具体用途和效果。 使用简洁明了的语言,避免使用过于专业的术语和长句子,让消费者能够轻松理解。 重点突出商品的卖点和优势,让消费者能够更加清晰地了解商品的价值 …

SpingMVC拦截器-用户登录权限控制分析

视频链接&#xff1a;08-SpringMVC拦截器-用户登录权限控制代码实现2_哔哩哔哩_bilibili 114 1、做了一个用户跟角色添加的相关操作 1.1 这个后台工程&#xff0c;没有进行相关操作也能够进行登录&#xff1a; 2、现在我做一个用户的权限控制&#xff0c;如果当前我没有进行操…

马原——5.两大总特征(辩证法)

两大总特征是解释了世界是怎样存在的。 三大规律是对两大总特征的进一步细化 对立统一规律解释了世界是怎样联系的&#xff0c;为什么发展 量变质变规律解释了怎样发展 否定之否定规律那里发展 五对基本范畴解释了联系和发展环节上的逻辑 客观性&#xff1a;不以人的意志为转…