SpringBoot 源码分析——运行原理探究

SpringBoot 源码分析——运行原理探究

本文参考来源西安西部开源秦疆老师,特此感谢

一、pom.xml

首先打开pom.xml,以往在没有使用SpringBoot时,我们在这里进行Maven以来导入等工作,但SpringBoot并不是这样,真正管理所有版本依赖的地方是其父类,SpringBoot帮我们已经配置好了,且进行了版本自动匹配(不会显示版本号),但我们如果需要到导入的包SpringBoot没有帮我们预配置,我们则需要在pom.xml文件中进行配置,并且配置上版本号
SpringBoot 源码分析——运行原理探究_第1张图片
SpringBoot 源码分析——运行原理探究_第2张图片

二、启动器

springboot-boot-starter:就是spring-boot的场景启动器,这里的spring-boot-starter-web 帮我们导入了web模块正常运行所依赖的组件
SpringBoot 源码分析——运行原理探究_第3张图片
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;

三、主程序

创建好的SpringBoot项目,默认会存在包名下存在一个类,例入这里是:
SpringBoot 源码分析——运行原理探究_第4张图片

package org.westos.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//@SpringBootApplication标注在一个SpringBoot项目的主程序类上,说明该类是主程序,程序的主入口
@SpringBootApplication
public class HelloworldApplication {

    public static void main(String[] args) {
        //将SpringBoot项目启动起来
        SpringApplication.run(HelloworldApplication.class, args);
    }

}

看似简单的主程序,其背后并不简单

四、@SpringBootApplication

@SpringBootApplication:此注解标注在SpringBoot应用的某个类上,说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用,进入这个注解:
SpringBoot 源码分析——运行原理探究_第5张图片

进入@SpringBootApplication注解后,我们首先来看@SpringBootConfiguration注解

@SpringBootConfiguration

@SpringBootConfiguration:标注在某个类上 , 表示这是一个SpringBoot的配置类;我们继续进去这个注解查看:
SpringBoot 源码分析——运行原理探究_第6张图片

重点是@Configuration注解,配置类上来标注这个注解我们继续点进去,发现配置类也是容器中的一个组件,@Component即表示组件的意思
SpringBoot 源码分析——运行原理探究_第7张图片

@EnableAutoConfiguration

此注解用于开启SpringBoot自动配置功能,以前我们需要配置的东西,SpringBoot可以自动帮我们配置 ; @EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效,我们点进去查看这个注解:
SpringBoot 源码分析——运行原理探究_第8张图片

首先来看**@AutoConfigurationPackage**,该注解能实现自动配置包的功能,继续点进去:
SpringBoot 源码分析——运行原理探究_第9张图片

我们来看**@Import(AutoConfigurationPackages.Registrar.class)**这个注解

@import :Spring底层注解@import , 给容器中导入一个组件 ,导入的组件由 {Registrar.class} 将主配置类 【即@SpringBootApplication标注的类】的所在包及包下面所有子包里面的所有组件扫描到Spring容器

然后回到@EnableAutoConfiguration类看**@Import(AutoConfigurationImportSelector.class)**注解,AutoConfigurationImportSelector 为导入哪些组件的选择器 ,**它将所有需要导入的组件以全类名的方式返回 , 这些组件就会被添加到容器中 ;**它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件

有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

我们在AutoConfigurationImportSelector里找到getCandidateConfigurations及其方法,可以看到该方法返回自动配置类名,即配置文件信息:
SpringBoot 源码分析——运行原理探究_第10张图片

我们再进入 SpringFactoriesLoader 查看
SpringBoot 源码分析——运行原理探究_第11张图片

该类的方法会通过反射读取一个配置文件:META-INF/Spring.factories

我们打开spring.factories的配置文件 , 看到了很多自动配置的文件;这就是自动配置根源所在
SpringBoot 源码分析——运行原理探究_第12张图片

SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作,以前我们需要自己配置的东西,自动配置类帮我们做了

真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中

五、run方法分析

分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行

SpringApplication

该类在程序中主要的四个功能:

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器 , 设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

run方法的执行

SpringBoot 源码分析——运行原理探究_第13张图片

你可能感兴趣的:(框架)