2021-03-27

SpringBoot的自动配置原理之一

我自己认为springboot自动配置最重要的是run()方法和@springbootapplication注解
大致流程图
在这里插入图片描述

@springbootapplication注解
在这里插入图片描述
第一个@ComponentScan就是扫描当前主体类同级的包
这也是springboot建立包必须同级的原因,必经框架是约定大于配置


第二个@SpringBootConfiguration表示这是一个spring boot的配置
在这里插入图片描述
在这里插入图片描述

他的里面就是一个@Configuration 表示他是一个spring配置 再往里面就是一个@Component表示是他是一个组件 。总之springboot是在spring基础上肯定还是有spring的组件

第三个@EnableAutoConfiguration里面有两个重要的注解
1@AutoConfigurationPackage
2@Import({AutoConfigurationImportSelector.class})
先看第一个@AutoConfigurationPackage自动导入配置包
里面有一个@Import({Registrar.class})叫做自动配置包注册,Registrar.class里面有一个方法叫registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) 导入metadata源数据
第二个@Import({AutoConfigurationImportSelector.class})里面的AutoConfigurationImportSelector.class叫做自动配置导入选择
这个类下面的selectImports(AnnotationMetadata annotationMetadata)选择要加载的组件
getAutoConfigurationEntry()方法

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
        

List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
getCandidateConfigurations这个方法中有

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.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;
    }

其中 loadFactoryNames获取获取所有的包名,类名,通过一个 Enumeration urls = classLoader.getResources(“META-INF/spring.factories”);去获取META-INF/spring.factories里面所有的配置用一个while()循环遍历,将遍历到的 Properties properties = PropertiesLoaderUtils.loadProperties(resource);加载到properties 里面。

Assert.notEmpty保证configurations不为空且去META-INF/spring.factores里面找配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值