SpringBoot自动装配源码分析

前言

SpringBoot 就是一个基于spring的一个框架。提供了一些自动配置的依赖包,自动嵌入servlet的容器,简化了我们开发的配置,提升开发人员的开发效率,并解决了包依赖的问题。SpringBoot有两个最核心的特点就是:版本控制、自动配置 而我们今天就是重点来讲解一下自动配置的过程

一、了解SpringBootApplication

如果我们的类上有这个SpringBootApplication注解,那么就表示这个类是我们的主启动类,相当于工程的入口,这里可以按住 Ctrl+左键 点击进去查看一下里面的注解信息

SpringBoot自动装配源码分析_第1张图片
SpringBoot自动装配源码分析_第2张图片

二、@SpringBootConfiguration理解

1.点进@SpringBootConfiguration 查看一下

SpringBoot自动装配源码分析_第3张图片

2.Java的配置类有一个特点 就是这个类下可以使用@Bean注解 来注册对象到容器中

SpringBoot自动装配源码分析_第4张图片

三、@ComponentScan理解

1.这个注解相信大家也是非常的熟悉吧,他的作用的是扫描指定的包下所有的注解 将这些注解下的类实例化并注册到容器中

2.看一下我们代码里面的@ComponentScan 发现他并没有指定扫描哪个包 那么在这里给大家说一下 如果没有指定扫描路径 那么他默认就是扫描启动类所在的 同级包以及同级包下的子包 组件 并注册到容器中SpringBoot自动装配源码分析_第5张图片#### 3.给大家验证一下我的说法 现在我们将这个三个注解复制出来 然后替换掉外面的@SpringBootApplicaiton

SpringBoot自动装配源码分析_第6张图片

4.创建一个验证能否被扫描的HelloServcie类 加上@Component

SpringBoot自动装配源码分析_第7张图片

5.运行主方法

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

    public static void main(String[] args) {
        //这个方法实际上返回值是Spring容器
        ApplicationContext context = SpringApplication.run(SpringbootAutoApplication.class, args);
        //从容器中获取到所有的BeanDefinition对象(可以理解为容器中的对象)
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        //遍历所有的对象
        for (String beanDefinitionName : beanDefinitionNames) {
            System.out.println(beanDefinitionName);
        }
        //容器中的对象数量
        System.out.println("容器中的对象数量" + beanDefinitionNames.length);
    }

    //相当于spring配置文件中的
    @Bean
    public Student student() {
        return new Student();
    }
}

6.运行主方法 查看一下控制台信息

在这里插入图片描述
SpringBoot自动装配源码分析_第8张图片

7.现在将@ComponentScan注解去掉 再测试一下方法

SpringBoot自动装配源码分析_第9张图片
在这里插入图片描述
SpringBoot自动装配源码分析_第10张图片

四、@EnableAutoConfiguration(重点 最核心的部分)

1.这个注解的字面意思就是开启自动配置、也就是我们今天讲的最核心的部分 他的作用就是在启动类启动的时候,扫描类路径,查找 位于META-INF目录中名为spring.factories的所有文件,并对其进行处理,完成自动配置。

2.我们点进@EnableAutoConfiguration查看一下信息 里面有2个核心注解 SpringBoot自动装配源码分析_第11张图片

一个是@AutoConfigurationPackage

这个注解有什么用呢? 我们点进去看一下 发现里面又使用了一个注解@Import 导入了AutoConfigurationPackages.Registrar.class

SpringBoot自动装配源码分析_第12张图片

我们点击Registrar.class进去看一下 SpringBoot自动装配源码分析_第13张图片

可以看到这个方法 传入了两个参数 一个metadata对象和registry 这里我们启动主入口类调试一下

SpringBoot自动装配源码分析_第14张图片

现在可以通过这个注解 来计算出注解所在类的包路径了

SpringBoot自动装配源码分析_第15张图片

有了这个默认路径 那么就能帮助我们的@ComponentScan来完成默认的扫描注册了

别忘了 @EnableAutoConfiguration下面还有一个@Import注解 这个注解才是自动配置的核心 我们直接点进去看一下

SpringBoot自动装配源码分析_第16张图片
SpringBoot自动装配源码分析_第17张图片

点击getAutoConfigurationEntry 可以看到有一个方法getCandidateConfigurations 可以获得所有的候选配置

SpringBoot自动装配源码分析_第18张图片

那么springboot是从什么地方加载到这些配置类的呢 我们继续往下探究

点击getCandidateConfigurations方法 可以看到下面有一个方法 SpringFactoriesLoader.loadFactoryNames 传入了两个参数 我们点击第一个参数 看看传入了是什么东西

SpringBoot自动装配源码分析_第19张图片

参数1 返回了一个EnableAutoConfiguration.class对象 这个对象很关键

在这里插入图片描述

回退上一级 来到SpringFactoriesLoader.loadFactoryNames方法 我们点击loadFactoryNames

SpringBoot自动装配源码分析_第20张图片
SpringBoot自动装配源码分析_第21张图片

现在我们就去看一下META-INF/spring.factories文件对应的EnableAutoConfigration它的值到底有哪些

SpringBoot自动装配源码分析_第22张图片
SpringBoot自动装配源码分析_第23张图片
SpringBoot自动装配源码分析_第24张图片

我们再次启动调试模式 查看它扫描的时候到底扫描到多少个配置类(注意!每个springboot版本不同 扫描的配置类也会不同)SpringBoot自动装配源码分析_第25张图片

到这里肯定会有小伙伴会问了 我们启动的时候难道要全部加载则117个配置类吗? 这里可以告诉你 不用担心 因为在这些配置类里面 有一些注解@ConditionalOnClass @ConditionalOnClass 可以帮我们过滤掉一些不需要加载的数据 比如我们点击这个配置类看一下他们的条件注解是什么

SpringBoot自动装配源码分析_第26张图片

我们继续调试 一步一步往下执行

SpringBoot自动装配源码分析_第27张图片

到这一步大家可以看到 经过了@Conditionl条件注解的过滤 只剩下22个配置类 而这些配置类才是我们启动的时候真正去加载的配置内容

SpringBoot自动装配源码分析_第28张图片

总结

现在大家能够理解 SpringBoot自动配置的过程了吧~

你可能感兴趣的:(spring,boot,spring,源码,java)