Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • Java核心基础

  • 框架的艺术

    • Spring

    • Mybatis

    • SpringBoot

      • 如何用SpringBoot(2.3.3版本)快速搭建一个项目
      • 一步步带你看SpringBoot(2.3.3版本)自动装配原理
        • (一)概述
        • (二)pom文件的补充
        • (三)Spring boot启动器
        • (四)自动装配原理分析
        • (五)自动装配的总结
      • SpringBoot配置文件及自动配置原理详解,这应该是SpringBoot最大的优势了吧
      • SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单
      • SpringBoot整合SpringSecurity详解,认证授权从未如此简单
      • SpringBoot整合Shiro详解,还在自己写登陆注册早落伍了
      • SpringBoot如何实现异步、定时任务?
      • 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现
      • 如何使用SpringBoot写一个属于自己的Starter
      • SpringBoot请求日志,如何优雅地打印
      • 主线程的用户信息,到子线程怎么丢了
    • MQ

    • Zookeeper

    • netty

  • 分布式与微服务

  • 开发经验大全

  • 版本新特性

  • Java
  • 框架的艺术
  • SpringBoot
CodeEase
2023-09-20
目录

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

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号: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>
1
2
3
4
5
6

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

2-1.png

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

# (三)Spring boot启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
1
2
3
4

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

我们想要用什么功能,只需要找到对应的启动器就可以了。 springboot的启动器不多,spring官网中都可以找到。这里截取其中的一部分 https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

2-2.png

在依赖中引入这些启动器之后,会自动引入该场景的所有依赖并且自动配置。

# (四)自动装配原理分析

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

@SpringBootApplication
public class SpringbootdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootdemoApplication.class, args);
    }
}
1
2
3
4
5
6
7

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

2-3.png

最上面的四个注解为标准的元注解,在这里不是重点,核心注解为下面这两个@SpringBootConfiguration和@EnableAutoConfiguration,分别往深层找更加核心的注解

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

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

2-4.png

1:引入环境 2:引入bean加载器 3:引入资源加载器 4:资源选择器 继续向下看,getAutoConfigurationEntry 方法中第86行代码将所有的配置通过getCandidateConfigurations方法放进一个List集合中。

2-5.png

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

2-6.png

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

2-7.png

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

2-8.png

SpringApplication 看完启动类的注解后,我们来了解一下这段启动类唯一的一条代码 SpringApplication.run(),他的作用主要是以下四点 1.推断应用的类型是普通的项目还是Web项目 2.查找并加载所有可用初始化器,设置到initializers属性中 3.找出所有的应用程序监听器,设置到listeners属性中 4.推断并设置main方法的定义类,找到运行的主类

# (五)自动装配的总结

2-9.png

通过一张思维导图来总结一下自动装配的原理,通过上面对源码的分析,我们可以看出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.有了自动配置类,免去了我们手动编写配置文件的步骤。

上次更新: 2025/04/29, 17:22:06
如何用SpringBoot(2.3.3版本)快速搭建一个项目
SpringBoot配置文件及自动配置原理详解,这应该是SpringBoot最大的优势了吧

← 如何用SpringBoot(2.3.3版本)快速搭建一个项目 SpringBoot配置文件及自动配置原理详解,这应该是SpringBoot最大的优势了吧→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式