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定义的时候。

posted @ 2025-04-16 13:36  小张同学哈  阅读(25)  评论(0)    收藏  举报