SpringBoot 自动装配原理

一、什么是自动装配

自动装配是指应用程序启动时由容器自动扫描和装配相关的组件和模块,无须像传统的spring那样在xml文件中手动配置Bean,从而简化了应用程序的配置过程,提高开发效率。

二、@SpringBootApplication解析

进入到这个 @SpringBootApplication 注解中可以看到 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 三个注解,SpringBoot的自动装配主要是由这三个注解共同来实现。
在这里插入图片描述

2.1 @SpringBootConfiguration

@SpringBootConfiguration的作用是标记该类为配置类,在该注解中包含 @Configuration注解。
在这里插入图片描述
这个@Configuration注解就是JavaConfig形式的Spring Ioc容器的配置类,JavaConfig与传统的XML配置的区别如下:
(1)基于JavaConfig的配置方式如下:
在这里插入图片描述
(2)基于XML配置的方式如下:
在这里插入图片描述

2.2 @EnableAutoConfiguration

(1)在@EnableAutoConfiguration注解中有一个@AutoConfigurationPackage注解以及一个@Import 注解,并且在@Import 注解中导入了一AutoConfigurationImportSelector.class类。@AutoConfigurationPackage注解的作用是将添加该注解的类所在的package作为自动配置package进行管理,最关键的是@Import 注解导入的这个AutoConfigurationImportSelector.class类,这个类的作用就是将需要装配的类装配到IOC容器中,也就是SpringBoot实现自动装配最核心的地方。
在这里插入图片描述
(2)AutoConfigurationImportSelector.class 类中最核心的方法则是selectImports(),这个方法主要是读取META-INF/spring.factories文件,经过去重、过滤,等操作后将需要装配的配置的类集合返回给IOC容器并将这些类注册为bean。
在这里插入图片描述
(3)spring.factories文件需要在pom.xml文件中引入spring-boot-actuator-autoconfigure这个stater,在这个stater里面的META-INF目录下。
在这里插入图片描述

2.3 @ComponentScan

@ComponentScan注解作用是实现启动时扫描启动类所在的包以及子包下所有标记为bean的类交由IOC容器注册为bean。可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。所以SpringBoot的启动类最好是放在root package下,尽可能把所有的类都交由IOC容器去自动装配。
在这里插入图片描述

三、自动装配失败的可能情况

  1. 类没有被正确的扫描到:Spring Boot默认只会扫描启动类所在的包以及子包下的类,如果你的类不在这个路径下,那么Spring Boot就无法自动装配到容器中。
  2. 类没有被正确的标记:Spring Boot使用@ComponentScan注解来扫描类,如果你的类没有被正确的标记为@Component,@Controller,@Service等,那么Spring Boot就无法自动装配到容器中。
  3. 依赖冲突:如果你的项目中有多个版本的依赖存在冲突,Spring Boot可能无法正确处理这些依赖,这可能导致自动装配失败。

四、总结

SpringBoot自动装的实现主要是由启动类的@SpringBootApplication注解中的@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan三个注解共同完成自动装配;

  • @SpringBootConfiguration 注解标记启动类为配置类;
  • @ComponentScan 注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean;
  • @EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean。

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

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

相关文章

概率中的 50 个具有挑战性的问题 [9/50]:掷骰子

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…

你需要尽早知道的15个开源网络安全工具

在本文中,你将找到一个开放源码网络安全工具列表,你一定要查看这些工具。 开源工具代表了技术版图中的一股有活力的力量,体现了创新、协作和可访问性,这些工具是根据透明度和社区驱动的原则开发的,使用户能够根据其独特…

Vue-13、Vue深度监视

1、监视多级结构中某个属性的变化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>watch深度监视</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm…

Vue基础-搭建Vue运行环境

这篇文章介绍了在Vue.js项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Vue及Vue CLI工具、安装webpack模板、安装vue-router、创建Vue项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Vue.js开发环境&#xff0c;为后续的项目开发奠定…

端到端自动驾驶

自动驾驶主要流程&#xff1a;感知->预测->规划 预测是预测周围目标&#xff08;车、行人、动物等&#xff09;的轨迹&#xff0c;规划是规划自车的运动轨迹。 UniAD[CVPR 2023]: 使用transformer架构&#xff0c;统一自动驾驶流程&#xff0c;完成所有检测&#xff0c…

如何上传苹果ipa安装包?

目录 引言 摘要 第二步&#xff1a;打开appuploader工具 第二步&#xff1a;打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用…

Navicat 技术干货 | 为 MySQL 表选择合适的存储引擎

MySQL 是最受欢迎的关系型数据库管理系统之一&#xff0c;提供了不同的存储引擎&#xff0c;每种存储引擎都旨在满足特定的需求和用例。在优化数据库和确保数据完整性方面&#xff0c;选择合适的存储引擎是至关重要的。今天&#xff0c;我们将探讨为 MySQL 表选择合适的存储引擎…

【开源项目】轻量元数据管理解决方案——Marquez

大家好&#xff0c;我是独孤风。 又到了本周的开源项目推荐。最近推荐的元数据管理项目很多&#xff0c;但是很多元数据管理平台的功能复杂难用。 那么有没有轻量一点的元数据管理项目呢&#xff1f; 今天为大家推荐的开源项目&#xff0c;就是一个轻量级的元数据管理工具。虽然…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS的功能特色

《SPSS统计学基础与实证研究应用精解》1.2 SPSS的功能特色 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.2节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手…

NSSCTF Interesting_include

开启环境: 通过审计,我们可知: flag在flag.php中,可以利用php中伪协议 payload:?filterphp://filter/readconvert.base64-encode/resourceflag.php 将其base64解码就是flag. NSSCTF{3dc54721-be9e-444c-8228-7133fba76ad4}

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CPO-BP回归基于冠豪猪优化算法[24年新…

关于Vue前端接口对接的思考

关于Vue前端接口对接的思考 目录概述需求&#xff1a; 设计思路实现思路分析1.vue 组件分类和获取数值的方式2.http 通信方式 分类 如何对接3.vue 组件分类和赋值方式&#xff0c; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your p…

力扣最热一百题——只出现一次的数字

这个合集已经很久没有更新了&#xff0c;今天来更新更新~~~ 目录 力扣题号 题目 题目描述 示例 提示 题解 Java解法一&#xff1a;Map集合 Java解法二&#xff1a;位运算 C位运算代码 力扣题号 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 下述题…

腾讯云对象存储COS计算文件的大小

properties配置类 TencentCos.APPIDxxxxx TencentCos.SecretIdxxxxxxx TencentCos.SecretKeyxxxxxx TencentCos.testBucketxxxxxx TencentCos.CosPathhttps://xxxxxxxx.cos.ap-chengdu.myqcloud.com TencentCos.regionap-chengdu读取properties中的配置 import lombok.AllArg…

Thingsbaord采用redis缓存(自用)

在CentOS系统上&#xff0c;您可以通过以下步骤使用yum安装Redis&#xff1a; 添加EPEL仓库&#xff1a; 首先&#xff0c;需要添加EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;仓库&#xff0c;因为Redis可能不在默认的CentOS仓库中。使用以下命令添加EP…

盘活存量GPU资源 破局高校算力不足窘境

“凭啥做大模型的优先分配算力&#xff1f;人家1个人4块A800&#xff0c;我们10个人用2块3090&#xff01;这日子没法过了&#xff01;”听着团队成员们的吐槽&#xff0c;某国内顶尖高校非大模型团队带队的博士老W也颇为无奈&#xff1a;“我们虽然不是做大模型的&#xff0c;…

在微信公众号上怎么实现拼团功能

拼团魅力&#xff1a;微信公众号上的拼团功能如何助力营销 一、引言 在这个数字化时代&#xff0c;微信公众号成为了企业与消费者互动的重要平台。而拼团功能作为微信营销的一大利器&#xff0c;为企业带来了巨大的商业价值。那么&#xff0c;如何在微信公众号上实现拼团功能&…

将WebGL打包的unity项目部署至Vue中

一、webgl打包 创建一个空项目&#xff08;或者直接使用现成的项目都可以&#xff09;这里以该空项目为例子 注意&#xff1a; 如果你的unity项目中有文字&#xff0c;不需要使用unity默认的字体&#xff0c;需要更改它的字体&#xff0c;否则在最后生成的页面中会显示不出来…

Modelsim仿真软件注册

仅供学生学习 解决问题&#xff1a; 注意&#xff1a;操作之前先关闭Modelsim软件 1&#xff09;下载modelsim_crack.zip&#xff0c;解压。 解压后的文件列表如下&#xff1a; 2&#xff09;进入Modelsim的软件安装目录&#xff08;我的电脑的安装目录是D:\modeltech64_10.…

有哪些好用的防蓝光护眼台灯?防蓝光护眼灯品牌排行揭晓

对于大多数人来说&#xff0c;护眼灯已经不是什么新鲜概念。为什么要买护眼灯&#xff1f;相信很多人的回答都是“为了孩子”。为了保护儿童视力健康&#xff0c;越来越多家长选择为孩子购买一台护眼灯&#xff0c;也造就了这个相当具有中国特色的庞大市场。很多家长不放心台灯…