Configuration类的解析ConfigurationClassParser
ConfigurationClassPostProcessor从beanFactory中获取所有beanDefination,识别出Configuration注解的beanDefination,交由ConfigurationClassParser处理。
1. 检测是否有内部类,如果由内部类,优先处理内部类。如果内部类也有Configuration注解,则处理。
2. 检测是否有PropertySources注解,如果有则处理PropertySources。
3. 检测是否有ComponentScan注解,如果有则处理ComponentScan。
4. 检测是否有Import注解,如果有则处理Import。
5. 检测是否有ImportResource注解,如果有则处理ImportResource。
6. 检测类中所有方法,是否有Bean注解,则处理Bean注解。

如何保证用户自己在Configuration类中注册的bean能够覆盖AutoConfiguration类中注册的bean?
要做到这一点,Spring需要先知道用户注册了哪些bean,然后在进行ConditionOnBean条件评估时,才能正确评估。
ClasspathBeanDefinationScanner在处理ComponnetScan注解进行路径扫描时,扫描到的Component会直接将beandefination注册到容器中,而ConfigurationClassParser在处理Configuration类时,Configuration中定义的bean不会直接注册到容器,而是通过ConfigurationClass缓存起来,后续通过ConfigurationClassBeanDefinitionReader的loadBeanDefinitions统一加载并注册。
1. AutoConfigurationImportSelector是一个DeferredImportSelector,它会从META-INF/autoconfiguraton.imports文件中加载所有的AutoConfiguration类,并根据类上的Condition条件进行匹配。但是该selector会在所有的componentscan扫描完成只有才执行(也就意味着所有的用户自定义bean的beandefination都被注册到容器中了)
2. 在AutoConfiguration上的Condition条件的判断,分为两个阶段,第一个是进行Configuration类解析的时候,第二个阶段是真正往容器中注册bean定义的时候。
浙公网安备 33010602011771号