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

springboot自动装配原理(springboot知识点梳理二)

SpringBoot 3.x时代已经到来,这篇文章主要围绕还是2.7.x以下的版本作为记录。如有不正确的地方,望大佬们指正。

一、简述

springboot的的简述和启动流程都已经在(springboot(2.6.1版本)启动流程(springboot知识点梳理一)_onapplicationevent方法怎么启动-CSDN博客)文章中有进行记录,所以这里就不在进行记录了。这里主要记录一下自动装配原理。

 二、什么是自动装配

相对于传统的spring项目,springboot它不需要繁琐的配置,这主要归功于springboot的自动装配机制来实现的。例如,以前的spring需要配置数据源,事务等等,但是springboot在启动过程中,会自动完成这些配置,这使我们减少了开发难度和成本,更加注重业务的实现。

三、自动装配流程

  1. 在springboot项目中有一个注解@SpringbootApplication,这个注解是对@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan这三个注解进行了封装,其中@EnableAutoConfiguration是实现自动化配置的核心注解。
  2. 该注解有两个核心注解,一个是@AutoConfigurationPackage(自动化配置包),主要作用是扫描该包下面的所有组件,一个是@Import导入的AutoConfigurationImportSelector类,所谓的自动装配都是通过@Import注解中的AutoConfigurationImportSelector实现的。
  3. 这个类实现了一个导入器接口ImportSelector。该接口中存在一个方法selectImports,该方法的返回值是一个数组,数组中存储的就是要被导入到spring容器中的类全类名。
  4. 在AutoConfigurationImportSelector类中重写了selectImport方法,该方法内部就是读取了项目的classpath路径下的META-INF/spring-factories文件中的所配置的类的全类名
  5. 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到spring容器中

四、自动装配源码解析

自动装配主要是通过@springbootApplication注解是的@EnableAutoConfiguration注解来实现的,所以这篇文章也主要是围绕着它来进行记录。

 4.1 @EnableAutoConfiguration源码

 AutoConfigurationImportSelector会先执行,所以我们先了解它

4.2 @Import({AutoConfigurationImportSelector.class})的AutoConfigurationImportSelector类源码

4.3 批量导入getAutoConfigrationEntry源码

这个地方会进行过滤,不会把所有扫描的组件都进行加载,会根据条件来决定是否导入到spring容器中

 4.4  加载MATE-INF/spring.factories的getCandidateConfigurations方法源码

继续了解组件注册

4.5 查看@AutoConfigurationPackage(自动化配置包)选择器

4.6 Registrar类源码

注意点

@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包以及子包里面的组件扫描到IOC容器中,但区别是@AutoConfigurationPackage扫描@Enitity,@MapperSacn等第三方依赖注解,而@ComponentScan只扫描@Controller,@Service,@Component,@Repository这些常见注解,所以这两个扫描对象是不一样的

五、总结

springboot自动装配主要是通过spring-boot-autoconfigure包来实现,通过这个包springboot会在底层配好所有的组件。但是如果用户自己配置了,那么就以用户优先。

5.1 自动装配为什么不一次性全部加到容器中

如果spring中没有添加任何附加条件,此时的这些配置类中所定义的bean都会被导入到spring容器中,这样非常消耗内存,因此spring中提供了很多条件注解,通过这些条件注解控制某个配置是否有效

5.2 简单总结

在项目启动过程中,springboot框架会自动读取META-INF/spring.factories配置文件中的org.springbootframework.boot.autoconfigure.EnableAutoConfiguration所配置的配置类,然后将其中所定义的bean根据条件注解所指定的条件来决定是否需要将其导入到spring容器中

 六、通过一张图来简单了解流程

 参考文档:https://juejin.cn/post/7245170503798734904

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux系统上安装zookeeper
  • Ubuntu下设置文件和文件夹用户组和权限
  • Vue项目增加路由跳转全局进度条 NProgress.js
  • 【Rust光年纪】深入了解Rust语言的关键库:功能特点与使用场景分析
  • 一文总结代理:代理模式、代理服务器
  • 【Python】基础语法(下)
  • 代码混淆与代码打包---bash脚本
  • Spring笔记(五)——事务
  • 组件化开发
  • 【C++】C++中的find方法介绍
  • 无标题栏窗口通过消息模拟拖动窗口时,无法拖动的一个原因
  • 鸿蒙应用框架开发【基于原生能力的无障碍模式】
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • 基于Deap遗传算法在全量可转债上做因子挖掘(附python代码及全量因子数据)
  • 《计算机网络》(学习笔记)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • CSS 三角实现
  • HomeBrew常规使用教程
  • IndexedDB
  • java多线程
  • Mysql数据库的条件查询语句
  • NSTimer学习笔记
  • PHP变量
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring核心 Bean的高级装配
  • Vue2.x学习三:事件处理生命周期钩子
  • 从0实现一个tiny react(三)生命周期
  • 大型网站性能监测、分析与优化常见问题QA
  • 复习Javascript专题(四):js中的深浅拷贝
  • 给新手的新浪微博 SDK 集成教程【一】
  • 力扣(LeetCode)21
  • 前端面试总结(at, md)
  • 试着探索高并发下的系统架构面貌
  • 携程小程序初体验
  • 源码安装memcached和php memcache扩展
  • Linux权限管理(week1_day5)--技术流ken
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​【已解决】npm install​卡主不动的情况
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #14vue3生成表单并跳转到外部地址的方式
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (1)(1.13) SiK无线电高级配置(六)
  • (9)STL算法之逆转旋转
  • (C#)一个最简单的链表类
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (八)Flask之app.route装饰器函数的参数
  • (二)JAVA使用POI操作excel
  • (分布式缓存)Redis分片集群
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (离散数学)逻辑连接词
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)LINQ之路