非常详细的SpringBoot自动装配原理

非常详细的SpringBoot自动装配原理

先看SpringBoot的主配置类

在这里插入图片描述

里面有一个main方法运行了一个run()方法,在run方法中必须要传入一个被@SpringBootApplication注解的类。

@SpringBootApplication

SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就会运行这个类的main方法来启动SpringBoot项目。

我们开始进入@SpringBootApplication注解
在这里插入图片描述

@SpringBootApplication是一个组合注解。
在这里插入图片描述

主要由@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan组成
v

@ComponentScan

扫描类主体同级的包和子包
在这里插入图片描述
图中的excludeFilters的意思是排除一些过滤器,{中的两个类不用扫描}

@SpringBootConfiguration

首先我们先进入@SpringBootConfiguration
在这里插入图片描述

XML文件------>配置类

@EnableAutoConfiguration

注解本身是没有意义的,只是一个标签(AOP\反射才有意义)

@EnableAutoConfiguration是一个组合注解

这个注解是开启自动配置的功能。
在这里插入图片描述
接下来我们进入这个Registrar
在这里插入图片描述

我们开始debug这一行:
在这里插入图片描述
我们开始查询一下这个方法获取的内容
在这里插入图片描述
可见我们已经获取到了扫描包的路径

metadata:其实在debug的时候是指向@SpringBootApplication注解上的
在这里插入图片描述
在这里插入图片描述
@ComponentScan被扫描到的类会生成对象,被封装到AutoConfigurationPackages这个类里面

AutoConfigurationPackages(自动装配的包装类)

public abstract class AutoConfigurationPackages {
    ......
	static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata,
				BeanDefinitionRegistry registry) {
			register(registry, new PackageImport(metadata).getPackageName());
		}
		@Override
		public Set<Object> determineImports(AnnotationMetadata metadata) {
			return Collections.singleton(new PackageImport(metadata));
		}
	}
	......
}

通过自动装配——>自动注册(Registrar.class)到我们的项目中去

@Import(AutoConfigurationImportSelector.class)(自动导入包的核心)

老版本

进入AutoConfigurationImportSelector后会执行selectImports()方法

调用getAutoConfigurationEntry()
在这里插入图片描述

新版本中

进入AutoConfigurationImportSelector后会执行process()方法

调用getAutoConfigurationEntry()
在这里插入图片描述

调用getCandidateConfigurations()

在这里插入图片描述

getCandidateConfigurations : 加载自动化配置的类

configurations中默认有120个类被加载(如果导入了对应的场景启动器,那么自动配置类的条件注解就会生效,完成自动配置,被加载的类就会相应增加)
在这里插入图片描述在这里插入图片描述

通过查询我们可以看到被加载的120个类
在这里插入图片描述

通过文件流的方式加载文件
在这里插入图片描述
在这里插入图片描述
使用类加载器加载该路径下的所有spring.factories文件

我画了张图来辅助理解SpringBoot自动装配,建议学习SpringBoot自动装配的同学可以自己辅助画一下
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值