当前位置: 首页 > article >正文

Springboot 自动装配流程分析

目录

1.基础知识:

2.具体代码执行流程

3.流程总结:

4.参考文章:


1.基础知识:

springboot的自动装配是利用了spring IOC容器创建过程中的增强功能,即BeanFactoryPostProcessor, 其中的ConfigurationClassPostProcessor实现了BeanFactoryPostProcessor接口,在其中具体完成了springboot的自动装配过程,这个后置处理器会解析注解信息,启动类上有SpringbootApplication注解,这是一个复合注解,里面包含了@EnableAutoConfiguration注解 

@EnableAutoConfiguration注解中import了一个ImportSelector类AutoConfigurationImportSelector,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean。

2.具体代码执行流程

springboot main方法 -> SpringApplication.run

prepareContext方法完成SpringBoot项目的xxxApplication的BeanDefinition的注册;refreshContext通过spring的注解扫描完成自动装配。  

然后执行refreshContext(context)方法,然后进入到spring框架的refresh(....)方法:

调用invokeBeanFactoryPostProcessors(beanFactory)去执行注册好的所有BeanFactoryPostProcessor,其中就包括ConfigurationClassPostProcessor,由它去完成自动装配。具体是有ConfigurationClassParser这个类去完成的,它是所有配置类(加了注解的类@Configuration)的解析类。

所有的解析都在其方法parse(......)中,会调用processImports(......)方法去解析@Import注解,拿到import注解里面配置的类AutoConfigurationImportSelector.class

@Import注解: 

上面通过解析@Import注解,拿到类AutoConfigurationImportSelector之后,调用这个类里面的方法getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类,并生成对应的BeanDefinition,然后继续走spring的流程去生成bean

3.流程总结:

springboot main方法 -> SpringApplication.run -> refreshContext(context) -> refresh(....) -> invokeBeanFactoryPostProcessors(beanFactory) -> ConfigurationClassPostProcessor类的processConfigBeanDefinitions(.......)方法 -> ConfigurationClassParser类的parse(......)方法 -> processImports(......)解析@Import注解,拿到AutoConfigurationImportSelector.class -> getAutoConfigurationEntry -> getCandidateConfigurations从第三方组件的META-INFO/spring.factories文件中获取到配置类

在这里插入图片描述

流程中核心代码

//从spring.Factories文件中加载124个EnableAutoConfiguration,并进去条件过去重复的,不需要的EnableAutoConfiguration
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
            AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        }
        AnnotationAttributes attributes = getAttributes(annotationMetadata);
         //从spring.Factories文件中加载EnableAutoConfiguration 124个EnableAutoConfiguration
        List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
       // 去除重复的
        configurations = removeDuplicates(configurations);
        //去除排除的类
        Set<String> exclusions = getExclusions(annotationMetadata, attributes);
        checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        //过滤的不用的类
        configurations = filter(configurations, autoConfigurationMetadata);
        fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationEntry(configurations, exclusions);
    }

//从spring.Factories文件中加载EnableAutoConfiguration
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        return EnableAutoConfiguration.class;
    }

4.参考文章:

SpringBoot 自动装配流程以及核心源码剖析-CSDN博客

(1条消息) SpringBoot 启动过程和自动装配_spring boot 启动7个阶段_cap_qin的博客-CSDN博客


http://www.kler.cn/a/14549.html

相关文章:

  • 代码随想录算法训练营第三十九天|62.不同路径、63. 不同路径 II
  • SQLite数据库简单小入门学习(二)
  • 谁是液冷行业真龙头?疯狂的液冷技术!
  • Linux Shell 实现一键部署http+用户名密码登录
  • 1.13|1.14|1.15|1.6、GDB调试
  • LiangGaRy_学习笔记_Day01
  • 聊聊 maven的版本号version 以及maven指定版本号范围写法
  • 【Chatgpt4 教学】 NLP(自然语言处理)第九课 朴素贝叶斯分类器的工作原理 机器学习算法
  • 纳芯微携手企企通,打造全新数字化采购管理系统
  • C++设计模式之备忘录模式
  • Microsoft Defender for Office 365部署方案
  • 湿法冶金铼提取工艺
  • sqoop安装
  • AI 编程
  • MySQL数据类型
  • 1.10和1.11和1.12、Makefile
  • ADKEY多按键制作阻值选择
  • OpenJudge - 39:多项式输出
  • Jenkins+Python自动化测试持续集成详细教程(全网独家)
  • 基于html+css的图片展示32