SpringBoot 自动装配原理

本文深入探讨了SpringBoot的自动装配原理,从@Import注解开始,逐步解析AutoConfigurationImportSelector、loadMetadata、getCandidateConfigurations等关键方法,揭示了如何从META-INF/spring.factories文件加载自动配置类。文章指出,生效的自动配置依赖于启动器,并强调了条件判断的重要性。

发现导入选择器

@Import(AutoConfigurationPackages.Registrar.class)

在这里插入图片描述

点进AutoConfigurationPackages

//导入初始化的一些bean

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

//metadata 元数据

@Override

public void registerBeanDefinitions(AnnotationMetadata metadata,

BeanDefinitionRegistry registry) {

//PackageImport 导入元数据

register(registry, new PackageImport(metadata).getPackageName());

}

@Override

public Set determineImports(AnnotationMetadata metadata) {

return Collections.singleton(new PackageImport(metadata));

}

}

在这里插入图片描述

回到@EnableAutoConfiguration 注解

查看另一个注解 @Import(AutoConfigurationImportSelector.class) 自动配置导入选择

@Import(AutoConfigurationImportSelector.class)

点进AutoConfigurationImportSelector 看看

在这里插入图片描述

看到AutoConfigurationImportSelector 类中选择组件的方法

public String[] selectImports(AnnotationMetadata annotationMetadata)

选择组件:就是选择哪些我们配置的pom.xml中的东西

在这里插入图片描述

点进loadMetadata

在这里插入图片描述

来到 AutoConfigurationMetadataLoader类的方法

在这里插入图片描述

回到AutoConfigurationImportSelector

  • 继续分析 selectImports 方法

  • getCandidateConfigurations 获取所有的配置

List configurations = getCandidateConfigurations(annotationMetadata,

attributes);

在这里插入图片描述

  • 核心方法

  • getCandidateConfigurations 获取候选的配置

  • loadFactoryNames 首先通过加载器加载所有的

protected List getCandidateConfigurations(AnnotationMetadata metadata,

AnnotationAttributes attributes) {

List 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;

}

在这里插入图片描述

@SpringBootApplication 注解标注了 @EnableAutoConfiguration

在这里插入图片描述

说明一件事

@SpringBootApplication : 标注这个类是一个SpringBoot 的应用:启动类下的所有资源被导入

在这里插入图片描述

继续看getCandidateConfigurations 方法

  1. 这个配置不为空

  2. META-INF/spring.factories

  3. 自动配置的核心文件

在这里插入图片描述

查看spring.factories文件

在这里插入图片描述

spring.factories 文件内容

  1. Initializers 初始化的

  2. Application Listeners 监听的

  3. Auto Configuration Import Listeners 自动选择导入的包

  4. Auto Configuration Import Filters

  5. Auto Configure 自动配置

  6. Failure analyzers

  7. Template availability providers

在这里插入图片描述

查看spring.factories 文件中的WebMvcAutoConfiuration

在这里插入图片描述

WebMvcAutoConfiuration类

在这里插入图片描述

WebMvcProperties 类

在这里插入图片描述

spring.factories 文件从哪来?

&emspl先读了配置文件,才找到配置类

继续看getCandidateConfigurations 方法

点进去

在这里插入图片描述

来到springFactoriesLoader

查看loadSpringFactories方法

在这里插入图片描述

loadSpringFactories方法 可以看到springboot 把所有的资源都加载到配置类中

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

点击 FACTORIES_RESOURCE_LOCATION 常量

在这里插入图片描述

加载了spring.factories 文件的所有东西

在这里插入图片描述


[](()4结论:

  1. SpringBoot所有的自动配置都是在启动的时候扫描并加载;

  2. 所有的自动配置类都在这里面 spring.factories

  3. 但是不一定生效,要判断条件是否成立

  4. 只有导入了对应的start,就有对应的启动器了

  5. 有了启动器,我们自动装配就会生效,然后就配置成功了!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值