springboot启动流程 (2) 组件扫描

王柳  金牌会员 | 2023-6-19 08:53:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 917|帖子 917|积分 2751

SpringBoot的组件扫描是基于Spring @ComponentScan注解实现的,该注解使用basePackages和basePackageClasses配置扫描的包,如果未配置这两个参数,Spring将扫描该配置类所属包下面的组件。
在服务启动时,将使用ConfigurationClassPostProcessor扫描当前所有的BeanDefinition,解析Configuration类,如果Configuration类标注了ComponentScan注解,将获取basePackages和basePackageClasses配置并扫描对应的包下面的组件。
ConfigurationClassPostProcessor类

实现了BeanDefinitionRegistryPostProcessor接口,在Spring启动的invokeBeanFactoryPostProcessors阶段被调用。
BeanDefinitionRegistryPostProcessor接口

继承BeanFactoryPostProcessor接口,允许在常规BeanFactoryPostProcessor调用之前注册更多的BeanDefinition。特别是,这些BeanDefinition反过来可以定义BeanFactoryPestProcessor实例。
  1. public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
  2.         /**
  3.          * Modify the application context's internal bean definition registry after its
  4.          * standard initialization. All regular bean definitions will have been loaded,
  5.          * but no beans will have been instantiated yet. This allows for adding further
  6.          * bean definitions before the next post-processing phase kicks in.
  7.          */
  8.         void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
  9. }
复制代码
postProcessBeanDefinitionRegistry实现

在ConfigurationClassPostProcessor类的postProcessBeanDefinitionRegistry实现中:

  • 扫描当前所有的BeanDefinition,找出所有的Configuration类
  • 使用ConfigurationClassParser解析所有的Configuration类并找出需要注册的组件

    • 解析Component注解
    • 解析PropertySource注解
    • 解析ComponentScan注解
    • 解析Bean注解

  • 将解析出来的组件注册到Spring容器
解析ComponentScan注解

这里使用到了ComponentScanAnnotationParser类。专门用来解析@ComponentScan注解。
ComponentScanAnnotationParser类

[code]public Set parse(AnnotationAttributes componentScan, final String declaringClass) {        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,                        componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);        Class
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表