2

2022年了,你还不懂SpringBoot自动配置原理?

 2 years ago
source link: https://blog.51cto.com/gozhuyinglong/5089543
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

2022年了,你还不懂SpringBoot自动配置原理?

原创

2022年了,你还不懂SpringBoot自动配置原理?_spring boot

微信搜索:码农StayUp
主页地址: https://gozhuyinglong.github.io
源码分享: https://github.com/gozhuyinglong/blog-demos

Spring Boot 的自动配置可以根据添加的jar依赖,自动配置 Spring Boot 应用程序。例如,我们想要使用Redis,直接在POM文件中增加spring-boot-starter-data-redis依赖,然后我们配置下连接信息就可以使用了。

那么Spring Boot 是如何实现自动配置的呢?下面通过源码分析,来看自动配置的原理。

@SpringBootApplication注解

我们知道在Spring Boot 项目中,都会有一个@SpringBootApplication注解,它标识了该项目的启动类。该注解是一个组合注解,其中有一个@EnableAutoConfiguration注解,用于启用自动配置。

2022年了,你还不懂SpringBoot自动配置原理?_spring boot_02

@EnableAutoConfiguration注解

我们进入@EnableAutoConfiguration注解可以看到,通过@Import注解导入了AutoConfigurationImportSelector类,从类名可以看出,该类是通过实现ImportSelector接口来导入配置类的。

在之前的《 @Import注解:导入配置类的四种方式&源码解析》文章中,介绍了@Import可以通过ImportSelector的方式导入配置类,建议选看一下。

2022年了,你还不懂SpringBoot自动配置原理?_springboot_03

AutoConfigurationImportSelector类

可以看出,该类实现了DeferredImportSelector接口。

2022年了,你还不懂SpringBoot自动配置原理?_自动配置_04

那么该类是通过selectImports()方法导入配置类的,找到该方法。进入getAutoConfigurationEntry()方法。

2022年了,你还不懂SpringBoot自动配置原理?_spring boot_05

该方法是获取配置类的入口方法,我们进入getCandidateConfigurations()方法。

2022年了,你还不懂SpringBoot自动配置原理?_spring_06

该方法用于获取所有配置类的名字,最终是通过SpringFactoriesLoader加载器来获取的。

2022年了,你还不懂SpringBoot自动配置原理?_spring_07

SpringFactoriesLoader加载器

该类是 Spring 核心提供的一种类加载方式,用于加载资源文件META-INF/spring.factories中配置的类。loadFactoryNames()方法用于加载所有类的名字。

2022年了,你还不懂SpringBoot自动配置原理?_springboot_08

进入loadSpringFactories()静态方法,用于加载资源文件META-INF/spring.factories中配置的类。加载的类会放到缓存中,下次会直接从缓存中获取。

2022年了,你还不懂SpringBoot自动配置原理?_spring_09

指定资源文件的名称:META-INF/spring.factories

2022年了,你还不懂SpringBoot自动配置原理?_spring_10

META-INF/spring.factories资源文件

该资源可能出现在多个JAR文件中,而自动配置类的资源文件位于spring-boot-autoconfigure包下。

2022年了,你还不懂SpringBoot自动配置原理?_自动配置_11

这个资源文件中,包含了所有的自动配置类。文档内容必须是Properties格式,其中键是接口或抽象类的全类名,值是用逗号分隔的实现类列表,如下图:

2022年了,你还不懂SpringBoot自动配置原理?_springboot_12

如何通过引入依赖实现自动配置的?

我们以JdbcTemplateAutoConfiguration配置类为例,看下配置类里到底做了什么,以及它是如何做到通过引入依赖的方式,来实现自动配置的。

2022年了,你还不懂SpringBoot自动配置原理?_spring_13

其实也很简单,配置类中主要使用了@ConditionalOnClass注解,该注解会判断指定的类是否在classpath资源包内,如果都存在的话,才会构建当前配置类。

我们看到上图中org.springframework.jdbc.core.JdbcTemplate类不存在,那么该配置类也不会被注入到IOC容器中,我们也就无法使用。

我们通过引入spring-boot-starter-data-jdbc依赖,那类也会被找到,配置类也就生效了。

这就是Spring Boot 自动配置的原理了~

  • 打赏
  • 收藏
  • 评论
  • 分享
  • 举报

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK