您现在的位置是:首页 >技术杂谈 >Springboot 自动装配流程分析网站首页技术杂谈

Springboot 自动装配流程分析

困知勉行1985 2023-06-16 00:00:03
简介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博客

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。