SpringBoot源码-@Configuration配置处理
1. 解析Class,读取BeanDefinition
时机:refresh context,调用所有的BeanFactoryPostProcessor,其中SharedMetadataReaderFactoryContextInitializer会添加一个BeanPostProcessor:internalConfigurationAnnotationProcessor,这个会在接下来被调用 对象:FullConfiguration:@Configuration注解的类;LiteConfiguration:@Import注解的类 顺寻:根据Class的@Order进行排序 parse: 调用ConfigurationClassParser对象的parse方法来进行解析:
- 根据@Conditional判断是否需要跳过
- 处理@PropertySource
- 处理@ComponentScan:读取指定的包下的所有子类,挑选@Component注解的类,读取信息成为BeanDefinitionHolder,底层调用ComponentScanAnnotationParser类的parse方法:
- ClassPathBeanDefinitionScanner:扫描
classpath*:com/package/name/**/*.class,**注意,如果basePackage没有配置,则默认取@Configuration对应的类的包名 - 判断依据:MBean和@Component注解,包括其子注解
- 处理的注解:
- @Lazy
- @Primary
- @Role
- @Description
- @DependsOn
- ClassPathBeanDefinitionScanner:扫描
- 处理@Import:
- @SpringBootApplication
- @EnableAutoConfiguration
- @Import(AutoConfigurationImportSelector.class)
- @AutoConfigurationPackage
- @Import(AutoConfigurationPackages.Registrar.class)
- @EnableAutoConfiguration
- 上面@Import进来的class分为两种:
- ImportSelector:决定哪些Configuration类可以被选中,其子类DeferredImportSelector提供了分组的形式来细化管理Import
- AutoConfigurationImportSelector:处理SpringAutoConfiguration包下面定义的各种Bean等
- ImportBeanDefinitionRegistrar:注册BeanDefinition
- ImportSelector:决定哪些Configuration类可以被选中,其子类DeferredImportSelector提供了分组的形式来细化管理Import
- @SpringBootApplication
- 处理@ImportResource
- 处理@Bean
- 处理接口里的default方法
- 处理父类
- 递归处理过程中导入的ImportSelector,导入其定义的Configuration类,缓存
评论