在ConfigurationClassPostProcessor中的processConfigBeanDefinitions方法:
- spring会先在读取到的6个内部类以及外部注入的类中进行判断,是否存在配置类
- 如果外部注入的类中包含@Configuration注解,会先判断是否解析过,再进行下一步解析
- 创建一个解析器,调用解析器的parse方法,对配置类进行解析操作
- 在parse方法中,先对类的BeanDefinition类型进行判断,如果是加了注解的类,再继续调用解析器内部的parse方法,继续跟踪,最关键的方法为doProcessConfigurationClass
- 在doProcessConfiguratoinClass方法中,先对@PropertySources注解进行解析
- 然后对@ComponentScan和@ComponentScans进行解析,在对这俩注解解析时,先内部创建一个ClassPathBeanDefinitionScanner,然后根据注解中的配置,对Scanner进行相关配置,然后通过扫描配置的包产生一个
Set<BeanDefinitionHolder>
,其中存储了扫描到的BeanDefinition信息,并且相应的BeanDefinition已经注册到容器中 - 得到扫描出来的BeanDefinition的集合后,继续遍历,递归调用解析器的parse方法,直到处理完所有相关类中的需要被解析的注解
- 处理完Scan注解后,接着处理@Import注解