• SpringBoot自动装配源码解析


    Spirngboot为啥会比Spring使用更简单,少了那么多的Xml文件?一切都是基于SpringBoot的自动装配,当然SpringBoot的自动装配也是一个高频的面试题。

    1.@SpringApplication注解的源码分析

    在分析源码时,都要问一问为什么SpringBoot能基于自动装配?
    这是一个SpringBoot的项目
    在这里插入图片描述

    1.首先来看下SpringBoot的 @SpringBootApplication注解,在@SpringBootApplication注解下有三个注解,分别是 @SpringBootConfiguration@EnableAutoConfiguration
    @ComponentScan

    在这里插入图片描述

    2.查看 @SpringBootConfiguration 底层它其实就是一个 @Configuration注解,学过Spring的都知道 @Configuration 其实就是一个配置类

    在这里插入图片描述

    3.所以不关注这个注解,咱们直接查看 @EnableAutoConfiguration 这个注解

    在这里插入图片描述

    4.直接在进入 @AutoConfigurationPackage 注解下查看 发现又有一个 @Import(AutoConfigurationPackages.Registrar.class)

    在这里插入图片描述

    5.AutoConfigurationPackages 这个类下发现 它调取了getAutoConfigurationEntry()

    在这里插入图片描述

    6.然后这个 getAutoConfigurationEntry() 又调取了getCandidateConfigurations() 这个方法

    在这里插入图片描述

    7.在 getCandidateConfigurations() 这个方法下就2行代码,一行调取了loadFactoryNames() ,另外一个断言判空,但是好像看到一个
    META-INF/spring.factories.(spring的发可T锐死)

    在这里插入图片描述

    8.然后咱们看下这个loadFactoryNames()这个方法里做了什么
    在这里插入图片描述
    在这里插入图片描述

    1. 由上图咱们看到是加载了一个META-INF下的 spring.factories 然后循环遍历取元素
      这里就咱们看下 spring.factories 是个什么东西。

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

    10 全局搜索咱们发现spring.factories 文件是 spring-boot-autoconfigure下的一个文件
    到这里咱们就发现 spring.factories 文件里的信息,它与 POM.xml文件下的 spring-boot-starter-parent 父依赖下加载的启动类maven坐标的包类似
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    11.然后回到spring.factories文件,咱们随便点击一个类,会发现底层大量的使用了 @Conditional注解@Conditional注解来判断是否加载了spring-boot-starter-xxx之类的依赖,也就是Starter组件

    在这里插入图片描述

    到这里基本就明白为啥SpringBoot能够自动装配了,下面总结梳理一下
    总结:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中。

    在这里插入图片描述

    2.SpringApplication.run分析

    由于run方法源码过于繁琐,在这里就引用其他大佬的梳理的图作为了解
    run() 方法总结为4个步骤:
    1、推断应用的类型是普通的项目还是Web项目
    2、查找并加载所有可用初始化器 , 设置到initializers属性中
    3、找出所有的应用程序监听器,设置到listeners属性中
    4、推断并设置main方法的定义类,找到运行的主类

    在这里插入图片描述
    最后:

    关于springboot,谈谈你的理解: springboot 主要分: springboot的自动装配和run()
    springboot的自动装配:
    SpringBoot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中

    run():
    ①判断当前项目是普通项目还是web项目
    ②推断并设置main方法的定义类,找到运行的主类
    ③run方法里面有一些监听器,这些监听器是全局存在的,它的作用是获取上下文处理一些bean,所有的bean无论是加载还是生产初始化多存在。

  • 相关阅读:
    Python-入门-列表(四)
    IPTABLES问题:DNAT下如何解决内网访问内部服务器问题
    数列分块入门
    Ubuntu上安装和配置MySQL
    数字图像处理均衡化、规定化例题及解题思路
    Runable和Callable的区别?首先要搞清楚Thread以及FutureTask!
    拒绝服务攻击工具2
    193页5万字智慧物流园解决方案
    nginx代理无法访问后端服务
    semodule工具详解(1)
  • 原文地址:https://blog.csdn.net/qq_43652793/article/details/132798393