博客
关于我
springboot自动扫描添加的BeanDefinition源码解析
阅读量:798 次
发布时间:2023-02-27

本文共 2241 字,大约阅读时间需要 7 分钟。

Spring Boot 启动过程中的Bean定义加载机制

Spring Boot启动过程中,首先会收集需要加载的Bean的定义,作为BeanDefinition对象,添加到BeanFactory中去。这种操作是通过BeanDefinitionRegistry接口的void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)方法来完成的。

由于BeanFactory中只有getBean等方法获取Bean对象,为了实现BeanDefinition的添加和删除功能,BeanFactory的实现类需要同时实现BeanFactory和BeanDefinitionRegistry这两个接口。接下来,我们将深入分析Spring Boot如何查找Bean的定义并将其添加到BeanFactory中。

ConfigurationClassPostProcessor的作用

Spring Boot查找Bean的定义主要依赖于ConfigurationClassPostProcessor类。这个类实现了BeanDefinitionRegistryPostProcessor接口,其主要职责是通过postProcessBeanDefinitionRegistry方法向BeanDefinitionRegistry的实现类添加Bean的定义。

ConfigurationClassPostProcessor继承了BeanFactoryPostProcessor接口,其主要功能是增强BeanFactory的功能。在Spring Boot启动过程中,首先会创建BeanFactory,然后调用BeanFactoryPostProcessor对BeanFactory进行增强,最后创建Bean对象。

通过BeanFactoryPostProcessor对BeanFactory进行增强,主要是通过PostProcessorRegistrationDelegate的静态方法来完成的。在这个过程中,会调用到ConfigurationClassPostProcessor这个类。

ConfigurationClassPostProcessor的工作原理

ConfigurationClassPostProcessor的processConfigBeanDefinitions方法是BeanDefinitionRegistryPostProcessor接口的核心实现方法。这个方法的主要职责是通过ConfigurationClassParser解析配置类,找到所有带有@Configuration注解的配置类,并将其添加到BeanFactory中。

在processConfigBeanDefinitions方法中,首先会获取所有已经存在的BeanDefinition名单,然后通过ConfigurationClassParser解析每一个配置类。ConfigurationClassParser会分析每个配置类,找出其中的@Configuration注解,并将其转化为SourceClass对象进行进一步处理。

通过递归的方式,ConfigurationClassPostProcessor会处理当前配置类及其所有父类,确保所有配置类都被正确解析并添加到BeanFactory中。

ConfigurationClassParser的工作流程

ConfigurationClassParser的parse方法负责解析配置类,找到所有带有@Configuration注解的类。在解析过程中,如果发现配置类上有@Conditional注解,会进一步检查该注解是否需要跳过。如果不需要跳过,则继续解析配置类及其父类,确保所有配置类都被正确处理。

在解析过程中,ConfigurationClassParser会调用doProcessConfigurationClass方法,对每个配置类进行递归处理。这个方法会处理当前配置类及其父类,确保所有配置类都被正确解析并添加到BeanFactory中。

AnnotatedBeanDefinition的处理

在ConfigurationClassParser的processConfigurationClass方法中,会检查配置类上是否有@Conditional注解。如果有,会进一步检查该注解是否需要跳过。如果不需要跳过,则继续解析配置类及其父类,确保所有配置类都被正确处理。

需要注意的是,ConfigurationParser会对配置类进行递归处理,确保所有父类都被正确解析。在这个过程中,如果发现配置类是通过其他类导入的,会进行合并和替换操作,确保BeanFactory中的Bean定义是最新的。

总结

通过以上分析可以看出,Spring Boot在启动过程中,主要依赖于ConfigurationClassPostProcessor和ConfigurationClassParser来查找和加载配置类,确保所有带有@Configuration注解的类都被正确解析并添加到BeanFactory中。这个过程保证了Spring Boot能够自动发现和加载用户定义的Bean定义,确保应用程序能够正确运行。在实际开发中,可以通过自定义配置类和注解来灵活管理Bean的加载和配置。

转载地址:http://olvfk.baihongyu.com/

你可能感兴趣的文章