SpringBoot的自动装配原理

embedded/2024/9/20 7:27:54/ 标签: spring boot, java, spring

 SpringBoot自动装配原理


82e4baaf5dce4c24b266e79ea10a207e.png

SpringBoot的启动类上有一个注解:@SpringBootApplication 。该注解是三个注解的复合注解。

 1.@SpringBootConfiguration 注解
点进@SpringBootConfiguration 注解,可以发现其核心注解为@Configuration注解:

edef94eb4d2c4a9db80fd47dae53fcfe.png

@Configuration是一个类级别的注释,表明一个对象是 bean 定义的来源。@Configuration类通过带@Bean注解的方法声明 bean 。@Bean对@Configuration类方法的调用也可用于定义 bean 间的依赖关系
@Configuration在spring的注解开发中占有很重要的地位,你当你想要定义一个配置类并交给spring管理的时候你就可以在相关类上面加这个注解,并配合@Bean注解把对象交个spring去管理。

所以@SpringBootConfiguration 注解本质上就是一个@Configuration注解,用来标注某个类为 JavaConfig 配置类,有了这个注解就可以在 SpringBoot 启动类中使用```@Bean``标签配置类了,如下图所示。a7a0a2ef50e4456093c9dd84812a7d28.png

2.@ComponentScan 注解
@ComponentScan是Spring注解之一,用于在Spring应用程序上下文中启用组件扫描。组件扫描是自动检测和注册 Spring bean(组件)到应用程序上下文中的过程。

这个扫描的范围是:SpringBoot 主启动类的同级路径及子路径,扫描到特定的@Component、@Service、@Controler、@Repository、@Configuration等等注解后,会做相应的bean注册和配置文件bean注册工作。

3.@EnableAutoConfiguration 注解
点进这个注解可以发现 @Import(AutoConfigurationImportSelector.class),如下图所示。

f309e57f72244a5c98f9910a893940d9.png

@Import是Spring注解之一,用于在配置类中导入其他配置类或者普通的Java类。

通过@Impor注解,我们可以将其他配置类或者普通的Java类导入到当前配置类中,从而实现对这些类的引用和使用。可以用于将多个配置类组合在一起,或者引入第三方库中的配置类。

说白了在这里@Import注解的作用就是将 AutoConfigurationImportSelector 这个类导入当前类,这个类就是实现自动装配的核心。在这里它会加载spring.factories文件。文件里面的内容也会统一加载到spring容器中。

spring.factories中的这一百多个配置类,是否生效也是有一定条件的。

476d437dfac842c6938fa595d55c4f32.png

比如说这里:

@ConditionalOnClass:说明要导入相关依赖当前配置类才会生效。

@ConditionalOnMissingBean:说明当前spring容器没有创建redisTemplate对象(某些情况我们要手动定制一些bean),它才会创建该对象放入spring容器中管理。

a0761fa180994797b94621fe26769ac8.png

总结:

        在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

其中 @EnableAutoConfiguration 是实现自动化配置的核心注解。

该注解通过 @Import 注解导入对应的配置选择器。关键的是内部就是读取了 该项目和该项目引用的Jar包的的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。

在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要 将其导入到Spring容器中。

一般条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的 class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器 中使用。


http://www.ppmy.cn/embedded/22615.html

相关文章

leetcode刷题:两数之和

面试造火箭,工作拧螺丝,话虽如此,背背八股文,刷刷算法题,也可以提高自己的编程素养,一切目的是为了上岸,在此就不咬文嚼字,追求茴香豆的茴有几种写法了,换句话说&#xf…

使用Python和Pygame创建贪吃蛇游戏 [附源码]

目录 引言: 安装Pygame: 创建游戏窗口: 初始化游戏变量: 绘制蛇和食物: 游戏循环: 运行结果: 结语: 引言: 贪吃蛇游戏是一款经典的游戏,它简单…

Ubuntu20.04 [Ros Noetic]版本——在catkin_make编译时出现报错的解决方案

今天在新的笔记本电脑上进行catkin_make的编译过程中遇到了报错,这个报错在之前也遇到过,但是,我却忘了怎么解决。很是头痛! 经过多篇博客的查询,特此解决了这个编译报错的问题,于此特地记录!&…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果,基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t,希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支:…

XYCTF 2024 WP

战队:D0sec 队员:xiaolaisec,TianXx WEB Ezhttp 首先访问robots.txt有一个l0g1in.txt,访问即可得到账号和密码 BP抓包进行一系列伪造即可 Warm up 第一层payload:?val1[]1&val2[]2&md50e215962017&XY240610708…

Vue 生命周期

每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不同阶段添加自己的代码的机会。 生命周期四…

【ChatGPT】AI评论家,适合点评论文和文章的Prompt模

原文:【ChatGPT】AI评论家,适合点评论文和文章的Prompt模板 - 知乎 总结了一个提示词模板提供给大家,适合的场景: 1. 家长辅导孩子写作 2. 老师给学生的作文打分 3. 业余评论家点评文章 4. 小编审稿(可以早下班了&…

概率路线图probabilistic Roadmap搜索(结合了全局采样和图搜索的的思想)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言概率路线图probabilistic Roadmap搜索(结合了全局采样和图搜索的的思想)(1)PRM算法泛化过程1.概率路线图2.采样构建阶段3.概率图搜索阶段4.代码…

Android 11在app中修改屏幕亮度

先看效果&#xff1a; Android 11在app中修改屏幕亮度 展示视频 可以看到&#xff0c;这是一个非常简单的功能&#xff0c;拖动进度条&#xff0c;屏幕亮度随即变化&#xff0c;界面上也实时更新亮度值 实现部分&#xff1a; 一、布局文件 1.activity_brightness.xml <?…

UDP数据报套接字编程

UDP数据报套接字编程 DatagramSocket API DatagramSocket&#xff0c;是UDP Socket&#xff0c;用于发送和收 UDP 数据报。使用这个类&#xff0c;表示一个 socket 对象。一个 socket 对象只能跟一台主机进行通信。在操作系统中&#xff0c;把这个 socket 对象当成一个文件来…

恒峰智慧科技—高扬程水泵:解决远距离输水难题的新选择!

在森林消防领域&#xff0c;水泵是一个至关重要的设备。它的主要功能是将水源输送到火灾现场&#xff0c;为消防人员提供足够的水源进行灭火。然而&#xff0c;传统的水泵往往面临着距离限制的问题&#xff0c;这对于远距离输水来说是一个巨大的挑战。幸运的是&#xff0c;高扬…

甘特图是什么?利用甘特图来优化项目管理流程

在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组成。横轴代表时…

IDEA 中的奇技淫巧

IDEA 中的奇技淫巧 书签 在使用ctrlalt方向键跳转时&#xff0c;或者追踪代码时&#xff0c;经常遇到的情况是层级太多&#xff0c;找不到代码的初始位置&#xff0c;入口。可以通过书签的形式去打上一个标记&#xff0c;后续可以直接跳转到书签位置。 标记书签&#xff1a;c…

【论文阅读】互连网络的负载平衡路由算法 (CQR, Channel Queue Routing 通道队列路由)

Channel Queue Routing (CQR) 通道队列路由 1. Channel Queue Routing (CQR) 的动机 (1) 排队论(queueing theory)模型(2) GAL’s latency on tornado traffic(3) Routing tornado traffic with CQR 2. Channel Queue Routing 通道队列路由3. CQR 的性能4. 总结 Channel Queu…

新瑞知识产权集团庆祝世界知识产权日举办茶话会

新瑞知识产权集团庆祝世界知识产权日举办茶话会 强化行业交流与合作 日期&#xff1a;2024年4月26日 地点&#xff1a;佛山智慧新城T1栋 在世界知识产权日这样一个标志性的日子&#xff0c;新瑞知识产权集团在佛山智慧新城T1栋成功举办了一场主题茶话会。此活动吸引了数十名行业…

redis 使用互斥锁或逻辑过期两种方案解决缓存击穿,和缓存穿透(用缓存空值 或布隆过滤器)的解决方案

缓存穿透 缓存穿透是指在缓存中查找一个不存在的值&#xff0c;由于缓存一般不会存储这种无效的数据&#xff0c;所以每次查询都会落到数据库上&#xff0c;导致数据库压力增大&#xff0c;严重时可能会导致数据库宕机。解决方案&#xff1a; 1 缓存空值 (本文此方案) …

java后端项目:视积分抽奖平台

一、项目背景: 本次抽奖系统实现是在视频中内置一个线上活动抽奖系统,奖品是在一个时间段区间内均匀发布,用户可以在这个时间段内参与抽奖。 二、项目架构 活动抽奖平台采用微服务架构来完成,在功能上实现拆分为用户、网关、以及抽奖微服务,其中用户、网关是后台项目通…

前端计算机网络之网络模型

什么是网络模型 对于前端开发者而言&#xff0c;理解网络模型的概念是非常重要的。网络模型是描述数据如何在网络中传输和处理的框架和规则&#xff0c;它有助于前端开发者更好地理解和优化应用程序与服务器之间的通信过程。 常用的两类模型 前端开发者需要了解的网络模型主…

STM32-TIM定时器与PWM输出

学习目标&#xff1a; 1. 熟练掌握 TIM 的参数配置。 2. 掌握通道的参数配置。 3. 深刻理解 PWM 与功率的关系。 4. 理解 PWM 的原理示意。 一 什么是 PWM 输出 PWM &#xff08; pulse width modulation &#xff09;一种脉冲宽度调节技术。 PWM 的效果是什么样子&#xf…

养老金融:编织中国老龄社会的金色安全网

在科技金融、绿色金融、普惠金融、养老金融、数字金融这“五篇大文章”中&#xff0c;养老金融以其独特的社会价值和深远影响&#xff0c;占据着不可或缺的地位。十三届全国政协经济委员会委员、原中国保监会副主席周延礼先生近期在多个场合的发言&#xff0c;不仅凸显了养老金…