2.将每一个配置类的元信息封装到ConfigurationClass对象中,<br>分别调用<font color="#c41230">processConfigurationClass</font>方法进行处理
2.将configClass封装成SourceClass,<br>然后进入一个循环,循环条件是sourceClass不为空,<br>循环中调用doProcessConfigurationClass进行真正的处理,<br>循环中调用的方法的第八步会返回当前类的父类,实现循环调用
1.调用processMemberClasses递归处理内部类
2.处理@PropertySources跟@PropertySource注解,<br>将对应的属性资源添加容器中(实际上添加到environment中)
3.处理@ComponentScan,@ComponentScans注解<br>在子项中分析一下<font color="#c41230">ComponentScanAnnotationParser</font>的<br>parse方法的执行流程,ComponentScanAnnotationParser就是<br>当前ConfigurationClassParse的一个成员变量,<br><font color="#c41230"><b>注意,如果子项返回的BeanDefinition中有配置类,直接调用processConfigurationClass处理</b></font>
1.<font color="#c41230">创建一个ClassPathBeanDefinitionScanner对象</font><br>
2.解析成BeanDefinition时采用的beanName的生成规则
3.配置这个扫描注解规则下的ScopedProxyMode<br>和ScopeMetadataResolver
4.配置扫描器的匹配规则
5.配置扫描器需要扫描的组件的类型过滤器
6.配置扫描器不需要扫描的组件类型过滤器
7.配置默认是否进行懒加载
8.配置扫描器扫描的包名
9.添加排除过滤器过滤当前@ComponentScan所在类<br>
10.在完成对扫描器的配置后,直接调用其doScan方法进行扫描
1.调用findCandidateComponents方法,<br>得到ScannedGenericBeanDefinition集合<br>
2.遍历集合<br>
1.判断BeanDefinition是不是AbstractBeanDefinition类型的,<br>如果是就执行postProcessBeanDefinition方法
2.判断是不是一个AnnotatedBeanDefinition,<br>如果是的话,还需要进行额外的处理
3.检查容器中是否已经有这个bd了,如果没有就进行注册<br>
3.返回扫描得到的BeanDefinition集合<br>
11.返回扫描得到的BeanDefinition集合
4.处理@Import注解
1.递归遍历sourceClass得到所有的@Import注解的值作为一个参数传入
2.首先检查是否是循环引入,如果是循环引入,则不处理,只记录到错误日志中<br>
3.如果检查没有问题,先将当前的这个配置类压入导入栈中,<br>遍历传入的@Import注解的值的Set集合,子项中是循环体<br>
1.如果遍历的元素是ImportSelector类型的
2.如果是一个ImportBeanDefinitionRegistrar
3.既不是一个ImportSelector也不是一个ImportBeanDefinitionRegistrar,<br><b><font color="#c41230">直接导入一个普通类并将这个类作为配置类,<br>调用processConfigurationClass进行递归处理</font></b><br>
4.在循环前我们将其加入了导入栈中,循环完成后将其弹出,主要是为了处理循环导入
5.处理@ImportResource注解<br>
6.处理@Bean注解
7.处理接口中的default方法
8.返回当前类的父类,进行递归处理