1.循环入参的beanFactoryPostProcessors,增加到bean注册的集合registryProcessors,或者regularPostProcessors
2.首先执行类型为PriorityOrdered的BeanDefinitionRegistryPostProcessor,优先执行:获取bean,增加到当前的注册bean集合
3.其次执行类型为Ordered的BeanDefinitionRegistryPostProcessor,也是获取bean,增加到当前的注册bean集合
4.最后循环执行类型不为PriorityOrdered,Ordered类型的BeanDefinitionRegistryPostProcessor,处理过程同上
5.执行父类方法,优先执行注册处理类
开始自动装配
1.循环注册好的bean列表candidateNames,如果已经配置好了,就跳过去,汇总出需要配置的类列表
2.把这些需要配置的类进行排序
3.循环每个进行解析,调用parser.parse()
4.循环每个需要解析的beanDefinitionHolder,根据注解bean,抽象bean或者其他bean,分别各自parse解析
6.处理内部类逻辑,由于传来的参数是我们的启动类,不含内部类,所以跳过。
7.然后对属性配置的解析
8.然后根据启动类 @ComponentScan 注解来扫描项目中的bean
9.递归解析。所有的bean,如果有注解,会进一步解析注解中包含的bean
10.这里又是一个递归解析,获取导入的配置类。很多情况下,导入的配置类中会同样包含导入类注解。
11.解析导入的 xml 配置类
12.处理 单独的 @Bean修饰的方法
13.处理接口中的默认方法
14.继续处理父类
15.递归执行后,没有父类了,就结束递归
继续深入看parse的逻辑
1.首先初始化 ClassPathBeanDefinitionScanner
2.设置beanNameGenerator
3.设置scopedProxyMode
4.设置resourcePattern
5.设置includeFilter和excludeFilter
6.检查是否是懒加载,如果是,beanDefinition设置懒加载为true
7.获取扫描的basePackages
8.根据获取的basePackages,进行扫描,获取包路径下的candidates
9.循环每个candidates,先解析scope元数据
10.然后生成beanName
1.解析出属性