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

SpringBoot的自动装配原理

一、@SpringBootConfiguration注解的作用

                @SpringBootApplication注解是SpringBoot项目的核心注解,加在启动引导类上。点击进去可以发现@SpringBootApplication注解是一个组合注解。其中@SpringBootConfiguration@EnableAutoConfiguration是由Spring提供的,剩下的注解是由JDK提供的。对于SpringBoot项目,我们重点分析@SpringBootConfiguration和@EnableAutoConfiguration注解

1.1、@SpringBootConfiguration表示启动引导类是一个配置类

        点击@SpringBootConfiguration注解进去可以发现@SpringBootConfiguration注解也是一个组合注解,并且继承了@Configuration注解,说明@SpringBootApplication注解间接继承了

@Configuration注解。

        @Configuration注解又加在了启动引导类上面,说明启动引导类是一个配置类,配置类中加了@Bean注解的方法的返回值会放入Spring的容器中。

代码演示:

启动引导类中添加@Bean注解的方法

package com.itboy;import com.itboy.Import.MyImportSeletor;
import com.itboy.pojo.User;
import org.example.config.BrandAutoConfiguration;
import org.example.config.UserAutoConfiguration;
import org.example.pojo.Brand;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;/*** */
@SpringBootApplicationpublic class SpringBootPlusApplication {public static void main(String[] args) {ConfigurableApplicationContext app = SpringApplication.run(SpringBootPlusApplication.class, args);User user = app.getBean(User.class);System.out.println("user = " + user);}@Beanpublic User testUser(){return new User();}}

        运动程序,发现可以从容器中获得User对象,说明添加了@Bean注解的方法的返回值放到了Spring容器中。

所以@SpringBootConfiguration注解的第一个作用就是将启动引导类变成配置类

1.2、 @SpringBootConfiguration可以让测试类能够找到启动引导类

        注释掉启动引导类上面的@SpringBootApplication注解,然后启动@SpringBootTest测试类中的测试方法,会发现报错。

Unable to find a @SpringBootConfiguration 

说明 @SpringBootTest测试类中的测试方法会去找@SpringBootConfiguration注解。

此时需要手动指定启动引导类才能解决报错问题

 

1.3、总结 

 @SpringBootConfiguration注解的作用有:

1、表示启动引导类是一个配置类,因为相当于@SpringBootApplication注解间接继承了@Configuration注解。

2、 让测试类能够找到启动引导类,具体的看1.2中的内容。

二、@Import注解的作用 

 通过@Import注解中的导入器我们可以指定配置类。

我们在pom.xml配置文件中添加创建的模块

创建的模块结构如下图:

 

创建的模块中存在两个配置类UserAutoConfigurationBrandAutoConfiguration 

                                  

 

 

创建的模块和我们主模块之间的位置关系:

 

        所以创建的模块肯定不在spring_boot项目启动引导类的包及其子包中。 所以在spring_boot项目的容器对象中肯定不能获取到创建的模块中的User和brand对象。

        但是在启动引导类上添加@Import注解就能获取到User和brand对象。

        通过@Import注解中的导入器能指定配置类有哪些,@Import注解中的值相当于导入器,这里的MyImportSeletor.class是我自定义的导入器

 

        导入器需要实现ImportSelector接口,并重写selectImports方法,返回值为字符串数组,里面的值为配置类的全限定名,通过返回值就能确定配置类有哪些

        再找到配置类中加了@Bean注解的方法,方法的返回值就会放入spring的容器中。就完成了自动装配的工程。

总结

1、@Import注解可以通过导入器指定配置类。

2、@Import注解中的值是导入器,通过导入器我们可以指定配置类。

3、配置类中加了@Bean注解的方法的返回值就会放到spring容器中,从而实现自动装配。

三、@EnableAutoConfiguration注解的作用 

        @EnableAutoConfiguration注解是组合注解,继承了@Import注解。

        

        通过二中分析我们知道可以通过@Import注解中的导入器找到配置类,这里的AutoConfigurationImportSelector.class就是SpringBoot定义的导入器,所以继续点击导入器。

        发现AutoConfigurationImportSelector.class导入器中存在selectImports方法,并且方法返回值为字符串数组,与二中刚才的分析保持一致,所以这个selectImports方法就是指定配置类

 

        if的条件判断是返回没有导入的情况,所以else里面的逻辑才是指定配置类。 

        接着点击selectImports方法中的getAutoConfigurationEntry方法,再点击getAutoConfigurationEntry方法中的getCandidateConfigurations方法        

        

        接着点击 getCandidateConfigurations方法中的loadFactoryNames方法

    

 

         接着点击loadFactoryNames方法中的loadSpringFactories方法

        最后发现读取的是META-INF文件夹里面的spring.factorie文件 

 

总结:

1、 @EnableAutoConfiguration注解的作用是完成SpringBoot项目的自动装配。

2、会去读取META-INF文件夹里面的spring.factorie文件。

3、spring.factorie文件中定义了指定的配置类,找到配置类,并把配置类中加了@Bean注解的方法的返回值放入Spring容器就完成了自动装配。

四、自动装配的条件选择

4.1、SpringBoot自带的Starter和第三方Starter

        SpringBoot提供的Starter是以spring-boot-starter开头的,例如spring-boot-starter-webspring-boot-starter-test

                

        第三方提供的starter一般是以spring-boot-starter为结尾的。例如:mybatis-spring-boot-starter

       

 

4.2、通过在External Libraries中找到对应的jar包

        可以发现第三方Starter都会有 META-INF文件夹,并且META-INF文件夹里面肯定也会有spring.factorie文件。下面是mybatisspring.factorie文件里面的内容。

        

org.springframework.boot.autoconfigure.EnableAutoConfiguration是key值,固定的写法。

里面的value值定义了配置类,mybatis定义的配置类有:

MybatisLanguageDriverAutoConfiguration

MybatisAutoConfiguration

MybatisDependsOnDatabaseInitializationDetector

 4.3、ConditionalOn.....注解决定了哪些方法返回值放入Spring容器中

        打开4.2中找到的MybatisLanguageDriverAutoConfiguration配置类。

        可以发现 MybatisLanguageDriverAutoConfiguration类肯定被@Configuration注解定义了,那是不是这个类所有加了@Bean注解的方法的返回值都会放入Spring容器中完成自动装配呢?

         可以发现MybatisLanguageDriverAutoConfiguration类中的很多方法上面加了类似@ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制条件,所以并不是所有的加了@Bean注解的方法的返回值都会放入Spring容器中。

 

 

  总结:

1、 指定的配置类中并不是所有的加了@Bean注解的方法的返回值都会放入Spring容器中。

2、 @ConditionalOnClass、@ConditionalOnMissingBean等注解,都是限制条件。

 

五、自动装配原理总结

        通过@EnableAutoConfiguration注解,会去找到第三方jar包中META-INF文件夹里面的spring.factorie文件。

        spring.factorie文件里面指定了配置类,再找到配置类中加了@Bean注解的方法,再找到能通过@ConditionalOnClass、@ConditionalOnMissingBean等注解的限制条件后,就会将方法返回值放入Spring的容器中。

相关文章:

SpringBoot的自动装配原理

一、SpringBootConfiguration注解的作用 SpringBootApplication注解是SpringBoot项目的核心注解,加在启动引导类上。点击进去可以发现SpringBootApplication注解是一个组合注解。其中SpringBootConfiguration和EnableAutoConfiguration是由Spring提供的,剩下的注解是由JDK提供的…...

嵌入式驱动开发需要会哪些技能?

嵌入式驱动开发是指在嵌入式系统中编写驱动程序,实现设备与计算机之间的通信。嵌入式驱动开发是指编写设备驱动程序,实现设备与计算机之间的通信。以下是一些嵌入式驱动开发的具体操作方法: 1)了解硬件设备结构:在进行嵌入式驱动…...

Leetcode:二分搜索树层次遍历

题目: 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例: 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,…...

【fabric.js】toDataURL 性能问题、优化

必要解释:最好看完。。省流版的话,toDataURL 的 multiplier参数不要设置超过500; 情景:在做某些功能的时候涉及到图形的预览,预览的时候是导出为40*40 像素的图片,当碰到某些图形非常小的时候,…...

基于Grafana+Prometheus搭建可视化监控系统实践

基本介绍 Grafana:一个监控仪表系统,可以根据提供的监控数据,生产可视化仪表盘,同时也具有告警通知功能。这里的监控数据来源,目前主要以Prometheus为主(也支持其它数据源),每次展现…...

选择排序(堆排序和topK问题)

选择排序 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 如果我们用扑克牌来举例,那么选择排序就像是提前已经把所有牌都摸完了,而再进行牌…...

webpack tree shaking 摇树原理

Tree-shaking 是指在打包过程中通过静态分析,识别并删除未使用的代码,以减小最终输出文件的大小。Webpack 通过内置的 UglifyJS 插件或者 Terser 插件来实现 Tree-shaking。下面是简要的 webpack Tree-shaking 的原理: 标记未使用的代码&…...

开源模型应用落地-业务整合篇(三)

一、前言 在之前的两篇文章中,我们学习了如何构建基本的即时消息(IM)功能。今天,我们将进一步将IM模块与AI服务进行连接,实现用户提问并由模型进行回答,最后将结果展示在用户界面上。 二、术语 2.1. Spring Boot 是一个用于快速构建基于Spring框架的Java应用程序的开源框…...

js打地鼠

文章目录 1实现效果2代码实现 1实现效果 游戏难度:简单,一般,困难,噩梦(控制setInterval的time参数) 按钮功能:结束(可以通过修改gameScore的值来修改判定结束的分数)&am…...

计算机网络体系架构认知--网络协议栈

文章目录 一.计算机网络分层架构各协议层和计算机系统的联系从整体上理解计算机网络通信计算机网络通信的本质 二.Mac地址,IP地址和进程端口号三.局域网通信与跨局域网通信局域网通信跨局域网通信全球互联的通信脉络 四.网络编程概述 一.计算机网络分层架构 实现计算机长距离网…...

Ubuntu 22.04 安装tomcat

tomcat是常用的Java服务容器,这篇文章我们就来讲讲如何安装它。 更新软件包 首先是更新软件包,这是最常规的操作 sudo apt update 然后是开始安装,不多一会就可以安装好了 sudo apt install tomcat9 然后看一下状态 sudo systemctl status tomcat9 发现虽然启动了,但…...

记录:Ubuntu 18.04 X86 上通过CMake 指定编译器工具链交叉编译。

最好是通过 cmake 命令行来设置,要不然你只有在 CMakeFiles.txt 里面自己写判断语句了。 要用 cmake 交叉编译,必须设置连接器,要不然会使用当前系统的 ld,就是 /usr/bin/ld。 但是其它平台是不会ld上的,elf格式都不…...

requests,js逆向练习

自上而下排除jquery源码,点进去utils 发现第一次请求是getTime 再次运行此断点才是登录,这个时候密码已经被加密了 查看上级js页面,发现加密函数 进去看函数加密过程 得到结果RSA python代码 import base64 import jsonimport requests f…...

Chrome 插件调试

http://blog.haoji.me/chrome-plugin-develop.html#te-bie-zhu-yi-background-de-bao-cuo 手把手:Chrome浏览器开发系列(四):调试我们开发的插件 - 掘金...

云轴科技ZStack成为交通运输业上云用云推进中心首批成员单位

近日,中国信息通信研究院、中国交通运输协会信息专业委员会联合发起成立“交通运输业上云用云推进中心”,上海云轴信息科技有限公司(简称云轴科技ZStack)凭借优秀的产品技术创新能力和在交通运输领域的实践经验成为首批成员单位并…...

代码随想录算法训练营31期day4,力扣24+19+02.07+142

24,动指针 class Solution { public:ListNode* swapPairs(ListNode* head) {//建立虚拟头结点auto dummynew ListNode(-1);dummy->nexthead;for(auto pdummy;p->next&&p->next->next;){auto ap->next;auto ba->next;p->nextb;a->n…...

eNSP学习——利用单臂路由实现VLAN间路由

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址 配置步骤 创建VLAN并配置Access、Trunk接口 配置路由器子接口和IP地址 配置路由器子接口封装VLAN 测试结果 原理概述 在以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响&#…...

ISO27001认证:企业与个人发展的必备之选

ISO27001认证,对于企业和个人来说,都具有极高的价值和重要性。作为国际权威的信息安全管理体系标准,它为企业提供了保障信息安全、防范风险和提升竞争力的有力工具。 💼对企业的价值: ISO27001认证可以帮助企业满足国家…...

SpringBoot使用druid

SpringBoot使用druid 一、前言二、配置1、pom依赖2、配置文件yml3、配置类 一、前言 Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C…...

TongWeb8交流常见问答集

问题1:今后用到你们TongWeb产品该联系谁? 答复: 1. 商务问题,如:报价、license授权、合同等请联系销售。 2. TongWeb技术问题,未签项目联系售前,已签项目联系售后。有指定项目经理的项目&…...

2026 年行业真相:履职规范背后的管理秘密

现场冲突:安全与进度的激烈碰撞在工程建设领域,安全与进度的冲突一直是个老大难问题。就拿上海中心的建设来说,如此庞大复杂的项目,施工过程中安全管理难度极大。在某些施工阶段,为了赶进度,部分施工人员可…...

TypeGPT:全局AI助手实现原理与配置指南,让大模型无缝融入工作流

1. 项目概述:一个全局AI助手,如何让大模型无处不在 如果你和我一样,每天的工作流里充斥着各种文本输入场景——写代码、回邮件、在文档里做笔记、甚至在聊天软件里跟同事讨论问题,那你肯定也想过:要是能让AI助手随时待…...

QFN封装芯片手工焊接实战:从焊盘处理到拖焊技巧

1. QFN封装芯片手工焊接前的准备工作 QFN(Quad Flat No-lead)封装芯片因其体积小、散热好、电气性能优异等特点,在现代电子设备中越来越常见。但0.5mm甚至更小的引脚间距,让很多工程师和DIY爱好者在手工焊接时望而却步。其实只要掌…...

终极网盘直链下载助手完整指南:快速免费获取8大网盘真实下载地址

终极网盘直链下载助手完整指南:快速免费获取8大网盘真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...

从ST-Ericsson案例剖析半导体合资企业的战略困境与生存法则

1. 从一篇旧文看半导体合资企业的生存逻辑最近在整理行业历史资料时,翻到了一篇2011年发布于EE Times的文章,标题是《ST-Ericsson还能撑多久?》。这篇文章像一枚时间胶囊,精准地记录了一家曾经备受瞩目的无线芯片合资公司在特定时…...

为什么你的Windows桌面总是乱糟糟?NoFences免费桌面分区终极解决方案

为什么你的Windows桌面总是乱糟糟?NoFences免费桌面分区终极解决方案 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为杂乱无章的桌面图标而烦恼吗&#xff…...

基于python-telegram-bot的审批按钮系统设计与实现

1. 项目概述:一个为Telegram机器人设计的审批按钮系统如果你在团队协作、内容审核或者自动化流程中,经常需要通过Telegram机器人来处理“同意”或“拒绝”这类审批请求,那么你很可能遇到过这样的困扰:用户发来一条需要审核的消息&…...

03-从Chat到Act-Agent行动闭环的产品心理学拆解

从Chat到Act:Agent行动闭环的产品心理学拆解系列一:AI Agent GAP模型 | 第3篇(深度型) 从"一问一答"到"自主行动",拆解Agent行动闭环背后的行为设计逻辑。本文你将获得 🔄 Agent行动闭…...

AI00 RWKV Server:基于Vulkan的轻量级大模型本地推理部署指南

1. 项目概述:一个为RWKV模型打造的轻量级、高性能推理服务器 如果你正在寻找一个能让你在个人电脑上,甚至是集成显卡上,就能流畅运行大语言模型(LLM)的解决方案,那么AI00 RWKV Server绝对值得你花时间深入…...

旭雷禹鼎遥控器F21-E2B-8起重机天车行车电动葫芦工业无线遥控器

旭雷禹鼎遥控器F21-E2B-8起重机天车行车电动葫芦工业无线遥控器起重机工业无线遥控器的兼容性极强,可适配各类型号、不同吨位的起重机,无需大规模改造设备,大幅降低企业升级成本。无论是桥式起重机、门式起重机,还是塔式起重机、悬…...