SpringBoot自动装配原理

注:该文章作为笔记向,偶尔翻出来看看,以后学的更多会继续更改,若有问题,请指出

@SpringBootApplication

标注在某个类上,说明是主配置类

点进去后,还有三个注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
                                 @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

@ComponentScan

扫描包下的类

@SpringBootConfiguration

@Configuration

@Component

这里说明了主配置类就是spring里的一个组件

@EnableAutoConfiguration

开启自动配置,springboot帮我们自动配置

点进去又可以看见两个注解

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)

@AutoConfigurationPackage

自动配置包

点进去又有一个注解

@Import(AutoConfigurationPackages.Registrar.class)
//@Import:给容器中导入一个组件
/*
	AutoConfigurationPackages.Registrar.class
	自动配置包注册器的类
	将主启动类的所在包及包下面所有子包的所有组件扫描到Spring
*/

@Import(AutoConfigurationImportSelector.class)

AutoConfigurationImportSelector.class:自动配置导入选择器,会选择性的自动导入组件

点进AutoConfigurationImportSelector这个类

其中有这样一个方法

//获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    //getSpringFactoriesLoaderFactoryClass()方法返回了EnableAutoConfiguration注解类
    //这里就是说要导入的组件是在主配置类(EnableAutoConfiguration标识的)下所用到的
    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;
}

SpringFactoriesLoader.loadFactoryNames方法

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    ClassLoader classLoaderToUse = classLoader;
    if (classLoader == null) {
        classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
    }

    String factoryTypeName = factoryType.getName();
    //这个函数又去调用了loadSpringFactories
    return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}

再看loadSpringFactories方法,发现里面有说到一个META-INF/spring.factories

META-INF/spring.factories

这个文件就是自动配置的根源,他里面写了很多自动的配置文件(此处可以找到其位置)在这里插入图片描述

我们随便点开其中的一个自动配置类

在这里插入图片描述

都是先判断是否满足条件,再作为配置类导入容器(configuration注解)

结论

SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值