SpringBoot自动配置
我们都知道一个SpringBoot主配置类只要标注上@SpringBootApplication的注解,Spring就会帮我们自动配置各个组件和实例化Bean,我们来通过源码分析一下SpringBoot自动配置原理。
首先我们要知道,SpringBoot将符合条件的@Configuration类都加载到Spring容器中,就像一只八爪鱼,我们的启动类就是一个典型的@Configuration类。
@SpringBootApplication
包括下面两个关键的注解
@SpringBootConfiguration
@EnableAutoConfiguration
其中@SpringBootConfiguration 就是get主配置类添加上@Configuration 注解让主配置类的自动配置能被扫描到
下面我们主要分析一下@EnableAutoConfiguration 注解
@EnableAutoConfiguration
其中也包含两个关键注解
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
- 第一个用作包扫描自动配置
- 第二个导入AutoConfigurationImportSelector类用作SpringBoot提供的其他组件的自动配置选择器
我们先看一下第一个
@AutoConfigurationPackage
这个注解导入了SpringBoot中的Registrar类 用作包路径下的Bean扫描并注册到BeanFactory中
@Import({Registrar.class})
详细看一下这个类
Registrar注册类
其中主要的方法是registerBeanDefinitions
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//获取到元信息的包名传入注册器
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
传入两个参数:
- metadata 启动类元信息
- registry 用作注册的Bean注册器
目录结构如下:
元信息如下:
new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()获取到该启动类所在路径的包名,传如register方法注册该包名下的所有需要注册并实例化的Bean(包括@Component @Service @Mapper @Repository等)
AutoConfigurationPackages中register方法
public static void register(BeanDefinitionRegistry registry, String... packageNames)
<