非常详细的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自动装配的同学可以自己辅助画一下