SpringBoot自动装配源码分析

前言

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

一、了解SpringBootApplication

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

在这里插入图片描述
在这里插入图片描述

二、@SpringBootConfiguration理解

1.点进@SpringBootConfiguration 查看一下

在这里插入图片描述

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

在这里插入图片描述

三、@ComponentScan理解

1.这个注解相信大家也是非常的熟悉吧,他的作用的是扫描指定的包下所有的注解 将这些注解下的类实例化并注册到容器中
2.看一下我们代码里面的@ComponentScan 发现他并没有指定扫描哪个包 那么在这里给大家说一下 如果没有指定扫描路径 那么他默认就是扫描启动类所在的 同级包以及同级包下的子包 组件 并注册到容器中在这里插入图片描述#### 3.给大家验证一下我的说法 现在我们将这个三个注解复制出来 然后替换掉外面的@SpringBootApplicaiton

在这里插入图片描述

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

在这里插入图片描述

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 id="student" class="com.ysx.pojo.Student">
    @Bean
    public Student student() {
        return new Student();
    }
}
6.运行主方法 查看一下控制台信息

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

一个是@AutoConfigurationPackage

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

在这里插入图片描述

我们点击Registrar.class进去看一下 在这里插入图片描述
可以看到这个方法 传入了两个参数 一个metadata对象和registry 这里我们启动主入口类调试一下

在这里插入图片描述

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

在这里插入图片描述

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

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

那么springboot是从什么地方加载到这些配置类的呢 我们继续往下探究
点击getCandidateConfigurations方法 可以看到下面有一个方法 SpringFactoriesLoader.loadFactoryNames 传入了两个参数 我们点击第一个参数 看看传入了是什么东西

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们再次启动调试模式 查看它扫描的时候到底扫描到多少个配置类(注意!每个springboot版本不同 扫描的配置类也会不同)在这里插入图片描述
到这里肯定会有小伙伴会问了 我们启动的时候难道要全部加载则117个配置类吗? 这里可以告诉你 不用担心 因为在这些配置类里面 有一些注解@ConditionalOnClass @ConditionalOnClass 可以帮我们过滤掉一些不需要加载的数据 比如我们点击这个配置类看一下他们的条件注解是什么

在这里插入图片描述

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

在这里插入图片描述

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

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

总结

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值