springboot自动装配原理(通俗易懂)

@SpringBootApplication

首先在springboot的启动类上有这么一个注解,我们点进去可以看到以下三个核心注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

1、@SpringBootConfiguration

这个注解点进去我们可以看到@Configuration,表名当前类是一个配置类

2、@ComponentScan

指定扫描哪些,是spring的一个注解

3、@EnableAutoConfiguration(重要)

我们点进来这个注解可以看到有以下注解,我们进行一一探究

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)// 给容器导入一个组件
public @interface EnableAutoConfiguration {}

3.1、@AutoConfigurationPackage

我们点开这个注解可以看到如下注解,

@Import(AutoConfigurationPackages.Registrar.class)// 给容器导入组件
public @interface AutoConfigurationPackage {}

点开Registrar,如图springboot自动装配原理(通俗易懂)_第1张图片

我们可以看到有这么一个方法,该方法表示把指定包下的所有组件都导入进来,这个包就是我们启动类所在的包名,我们可以debug一下,如图

springboot自动装配原理(通俗易懂)_第2张图片

这也就解释了一个事情,组件如果不在一个包下,无法扫描到的问题

所以该注解就是自动配置包,指定了包的默认规则

3.2、@Import(AutoConfigurationImportSelector.class)

继续点进去,我们可以看到这么一个方法selectImports(给容器批量导入一些组件)

springboot自动装配原理(通俗易懂)_第3张图片

调用了getAutoConfigurationEntry方法,我们来研究一下这个方法

springboot自动装配原理(通俗易懂)_第4张图片

我们可以看到里面有一个配置的集合,我们打一个断点看看集合里面都是什么配置,debug一下

springboot自动装配原理(通俗易懂)_第5张图片

可以看到,List集合里面都是一些需要导入到组件中的配置类,那么问题来了,这些配置类时如何获取的呢,我们观察这个图中的这行代码:

98

打开getCandidateConfiguration方法,

springboot自动装配原理(通俗易懂)_第6张图片

该方法调用了一个工厂加载器,点开loadFactoryNames方法:

springboot自动装配原理(通俗易懂)_第7张图片

进入loadSpringFactories方法:

springboot自动装配原理(通俗易懂)_第8张图片

可以看到这个方法会扫描META-INF/spring.factories位置下的所有文件

这个文件我们可以在spring-boot-autoconfigure-2.5.4.jar里面找到

springboot自动装配原理(通俗易懂)_第9张图片

所有的自动配置类都在里面,最终会根据条件配置规则,按需配置。

你可能感兴趣的:(springboot,spring,boot,java,spring)