SpringBoot2.2.x 自动配置原理

自动配置原理

SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

@SpringBootApplication-->@SpringBootConfiguration/@EnableAutoConfiguration--->

在这里插入图片描述

  • Spring内部会把家里@SpringBootConfiguration注解的类,定义为根配置类
    在这里插入图片描述
  • EnableAutoConfiguration
    在这里插入图片描述
    @AutoConfigurationPackage 确定自动加载扫描包的路径
    @Import(AutoConfigurationImportSelector.class)
    AutoConfigurationImportSelector 这个类实现了这个接口DeferredImportSelector,然后这个接口又继承了这个ImportSelector接口,即
    在这里插入图片描述
    在这里插入图片描述
AutoConfigurationImportSelector implements DeferredImportSelector extends ImportSelector

ImportSelector这个接口有一个selectImports方法,其返回是的String数组,里面的内容必须是一些类的路径名称。比如说org.springframework.boot.autoconfigure.**。
Spring 会把这个数组返回出来的类路径名全部加载并且把他们注入到Spring IOC容器当中。
在这里插入图片描述

String[] selectImports(AnnotationMetadata importingClassMetadata);
  • AutoConfigurationImportSelector类重写了selectImports这个方法,
    在这里插入图片描述
  1. selectImports方法调用方法getAutoConfigurationEntry(autoConfigurationMetadata,
    annotationMetadata);
  2. getAutoConfigurationEntry()调用getCandidateConfigurations()方法,此方法是重点。
  3. getCandidateConfigurations()方法中,使用SpringFactoriesLoader类下的loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)方法,其中有两个参数,第一个参数指的是需要加载的类的类型,这里做了进一步指定,实则是META-INF/spring.facatories文件下的org.springframework.boot.autoconfigure.EnableAutoConfiguration,下面有131个类路径。第二个参数是ClassLoader类加载。这个loadSpringFactories()返回loadSpringFactories()方法,进一步进入loadSpringFactories()方法,可以看到获取FACTORIES_RESOURCE_LOCATION属性,而
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

此配置文件"META-INF/spring.factories"即是要默认自动装载的所有的类路径文件,这里自动配置的是org.springframework.boot.autoconfigure.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;
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值