一步步带你看SpringBoot(2.3.3版本)自动装配原理

简介: Springboot相比于之前spring的一个很大进步在于我们不用再手动配置一系列配置文件,springboot会自动帮我们配置。关于springboot自动装配的原理我们依旧需要了解。

点赞再看,养成习惯,听说微信搜公众号《Java鱼仔》会让自己的技术更上一层楼


(一)概述


Springboot相比于之前spring的一个很大进步在于我们不用再手动配置一系列配置文件,springboot会自动帮我们配置。关于springboot自动装配的原理我们依旧需要了解。


(二)pom文件的补充


我们在上一章讲到pom.xml时,说到了pom.xml文件首先会引入一个父依赖


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

逐层往上查找,可以在最顶层找到springboot的核心依赖spring-boot-dependencies,并且该依赖对大量springboot相关的依赖做了版本控制:


网络异常,图片无法展示
|


因此我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为在父依赖中已经有了这些版本仓库。


(三)Spring boot启动器


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

启动器其实就是Springboot的启动场景,比如在这个项目中,我们引入了spring-boot-starter-web,他就会帮我们自动引入web环境所有的依赖,并且会自动配置,springboot会将所有的功能场景,都变成一个个启动器。


我们想要用什么功能,只需要找到对应的启动器就可以了。 springboot的启动器不多,spring官网中都可以找到。这里截取其中的一部分


https://link.juejin.cn/?target=https%3A%2F%2Fdocs.spring.io%2Fspring-boot%2Fdocs%2Fcurrent%2Freference%2Fhtml%2Fusing-spring-boot.html%23using-boot-starter


网络异常,图片无法展示
|
在依赖中引入这些启动器之后,会自动引入该场景的所有依赖并且自动配置。


(四)自动装配原理分析


看完前面这些后我们正式通过代码来分析自动装配,SpringBoot的主程序也可以称为启动类,这是开启springboot项目的入口,接下来的操作建议打开程序自己来走一遍。


@SpringBootApplicationpublicclassSpringbootdemoApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
    }
}

@SpringBootApplication:这个注解标注这个类是一个springboot的应用 想想就知道这个注解将会是自动装配的核心,我们进入SpringBootApplication注解中(Ctrl+鼠标左键)

网络异常,图片无法展示
|
最上面的四个注解为标准的元注解,在这里不是重点,核心注解为下面这两个@SpringBootConfiguration和@EnableAutoConfiguration,分别往深层找更加核心的注解


@SpringBootConfiguration : springboot的配置
    @Configuration : spring配置类
        @Component : spring的组件
@EnableAutoConfiguration : 自动配置
    @AutoConfigurationPackage : 自动配置包
        @Import({Registrar.class}) : 自动配置包注册
    @Import({AutoConfigurationImportSelector.class}) : 导入选择器

@SpringBootConfiguration声明了这个类为spring的组件,


@EnableAutoConfiguration是自动配置的核心,其中@AutoConfigurationPackage对配置包进行了注册,AutoConfigurationImportSelector类来进行自动装配。 我们来看看AutoConfigurationImportSelector这个类。


网络异常,图片无法展示
|


1:引入环境


2:引入bean加载器


3:引入资源加载器


4:资源选择器


继续向下看,getAutoConfigurationEntry 方法中第86行代码将所有的配置通过getCandidateConfigurations方法放进一个List集合中。


网络异常,图片无法展示
|


继续看下去,点进LoadFactoryNames或者就从Assert.notEmpty的信息中,我们可以发现这些配置来自于META-INF/spring.factories中,顺藤摸瓜,可以在项目路径下的External Libraries下的autoconfigure中找到这个路径


网络异常,图片无法展示
|


可以在spring.factories文件中看到大量xxxAutoConfiguration,这个文件就记录了所有启动类的自动装配类,就是这些类在容器中导入了场景需要的所有组件;并通过@Configuration自动配置。


网络异常,图片无法展示
|


有些人会有疑问,为什么这个文件中已经有所有的自动装配类了,我们还要在pom.xml文件中引入启动器依赖。原因在于这些自动装配类中有@ConditionalOnClass注解,随便找一个没有引入依赖的自动装配类,比如RedisAutoConfiguration,因为没有引入启动器依赖,这里的类是找不到的,启动类也失效。除了@ConditionalOnClass,还有许多@ConditionalOnXXX注解都达到了条件判断的目的。


网络异常,图片无法展示
|


SpringApplication


看完启动类的注解后,我们来了解一下这段启动类唯一的一条代码 SpringApplication.run(),他的作用主要是以下四点


1.推断应用的类型是普通的项目还是Web项目


2.查找并加载所有可用初始化器,设置到initializers属性中


3.找出所有的应用程序监听器,设置到listeners属性中


4.推断并设置main方法的定义类,找到运行的主类


(五)自动装配的总结


网络异常,图片无法展示
|


通过一张思维导图来总结一下自动装配的原理,通过上面对源码的分析,我们可以看出springboot所有的自动配置都在启动类中被扫描和加载。所有的自动配置类都在spring.properties中。 自动装配总结起来可以分为以下几步:


1.springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;


2.将这些自动配置的类导入容器,自动配置就会生效,进行自动配置!


3.以前我们需要自动配置的东西,现在springboot帮我们做了


4.自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下


5.它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;


6.容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并通过@Configuration自动配置。


7.有了自动配置类,免去了我们手动编写配置文件的步骤。



相关文章
|
6天前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
3月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
101 0
|
4天前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
17天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
2月前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
2月前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
|
2月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
3月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List&lt;User&gt; users = userMapper.getAllUsers(); PageInfo&lt;User&gt; pageInfo = new PageInfo&lt;&gt;(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
2月前
|
Java
SpringBoot和SpringCloud对应版本
SpringBoot和SpringCloud对应版本
72 0
|
3月前
|
Java Maven
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
下一篇
无影云桌面