2022年了,你还不懂SpringBoot自动配置原理?
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.
2022年了,你还不懂SpringBoot自动配置原理?
原创微信搜索:码农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
注解,用于启用自动配置。
@EnableAutoConfiguration注解
我们进入@EnableAutoConfiguration
注解可以看到,通过@Import
注解导入了AutoConfigurationImportSelector
类,从类名可以看出,该类是通过实现ImportSelector
接口来导入配置类的。
在之前的《 @Import注解:导入配置类的四种方式&源码解析》文章中,介绍了@Import
可以通过ImportSelector
的方式导入配置类,建议选看一下。
AutoConfigurationImportSelector类
可以看出,该类实现了DeferredImportSelector
接口。
那么该类是通过selectImports()
方法导入配置类的,找到该方法。进入getAutoConfigurationEntry()
方法。
该方法是获取配置类的入口方法,我们进入getCandidateConfigurations()
方法。
该方法用于获取所有配置类的名字,最终是通过SpringFactoriesLoader
加载器来获取的。
SpringFactoriesLoader加载器
该类是 Spring 核心提供的一种类加载方式,用于加载资源文件META-INF/spring.factories
中配置的类。loadFactoryNames()
方法用于加载所有类的名字。
进入loadSpringFactories()
静态方法,用于加载资源文件META-INF/spring.factories
中配置的类。加载的类会放到缓存中,下次会直接从缓存中获取。
指定资源文件的名称:META-INF/spring.factories
META-INF/spring.factories资源文件
该资源可能出现在多个JAR文件中,而自动配置类的资源文件位于spring-boot-autoconfigure
包下。
这个资源文件中,包含了所有的自动配置类。文档内容必须是Properties格式,其中键是接口或抽象类的全类名,值是用逗号分隔的实现类列表,如下图:
如何通过引入依赖实现自动配置的?
我们以JdbcTemplateAutoConfiguration
配置类为例,看下配置类里到底做了什么,以及它是如何做到通过引入依赖的方式,来实现自动配置的。
其实也很简单,配置类中主要使用了@ConditionalOnClass
注解,该注解会判断指定的类是否在classpath
资源包内,如果都存在的话,才会构建当前配置类。
我们看到上图中org.springframework.jdbc.core.JdbcTemplate
类不存在,那么该配置类也不会被注入到IOC容器中,我们也就无法使用。
我们通过引入spring-boot-starter-data-jdbc
依赖,那类也会被找到,配置类也就生效了。
这就是Spring Boot 自动配置的原理了~
- 打赏
- 赞
- 收藏
- 评论
- 分享
- 举报
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK