查看SpringBoot的源码,了解运行原理

简单查看SpringBoot的源码

一. 了解自动生成的文件

打开SpringBoot项目后,系统会自动生成一个SpringbootDemo01Application.java文件用于存放程序的主方法,此外会生成application.properties存放配置文件,pom.xml依旧存放各种程序需要的依赖。
在这里插入图片描述

二. 简单查看SpringBoot的底层

二.1. 查看pom.xml

点开项目的pom.xml之后找到parent标签就可以找到本项目的父项目(SpringBoot的启动器)。在这里插入图片描述

父项目就是SpringBoot管理依赖的地方,SpringBoot的版本管理控制的地方,有此文件今后导入依赖就不需要写版本了(如果导入的包没有在依赖中管理着就需要手动配置版本了)。在这里插入图片描述
启动器:SpringBoot将所有的功能场景都抽取出来,做成一个个的启动器,只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可。
在这里插入图片描述
springboot-boot-starter:就是spring-boot的场景启动器。spring-boot-starter-web帮助我们导入了web模块正常运行所需的组件。

二.2. 查看主程序

首先我们进入SpringbootDemo01Application.java,会看到主方法、run方法以及@SpringBootApplication注解。由于我们要查看源码,所以Ctrl点进@SpringBootApplication查看源码:

@SpringBootApplication用来标注一个主程序,说明是一个SpringBoot应用。main方法用来将spring应用启动起来。
在这里插入图片描述

二.2.1 SpringBootApplication

@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。进入这个注解后会发现程序被@SpringBootConfiguration、@ComponentScan及@EnableAutoConfiguration注解修饰。在这里插入图片描述
下面我们分别点进源码,查看这三个注解的作用。

  1. @SpringBootConfiguration

    @SpringBootConfiguration:SpringBoot的配置类 ;标注在某个类上 , 表示这是一个SpringBoot的配置类;我们继续进去这个注解查看;
    在这里插入图片描述
    点进Configuration发现发现配置类也是容器中的一个组件

  2. @ComponentScan
    在这里插入图片描述
    @ComponentScan它对应xml配置中的元素。@ComponentScan的功能就是自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中。在这里插入图片描述

  3. @EnableAutoConfiguration

    回到 SpringBootApplication 注解中继续看@EnableAutoConfiguration(开启自动配置功能)我们需要的配置,SpringBoot可以自动帮我们配置,@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效

    我们点进源码查看会看到@AutoConfigurationImporServlet和@Import({AutoConfigurationImportSelector.class}) (给容器导入组件 AutoConfigurationImportSelector :它将所有需要导入的组件以全类名的方式返回 , 这些组件就会被添加到容器中 ;)两个注解:

    1. @AutoConfigurationPackage : 自动配置包 , 点进去看到一个 @Import({Registrar.class}):Spring底层注解@import , 给容器中导入一个组件 ,导入的组件由 {Registrar.class} 将主配置类 (即@SpringBootApplication标注的类)的所在包及包下面所有子包里面的所有组件扫描到Spring容器 [外链图片转存失败(img-676K0reP-1565580571905)在这里插入图片描述
      2. 点击进入AutoConfigurationImportSelector的源码,点击进入SpringFactoriesLoader的源码,找到public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";。META-INF/spring.factories是一个配置文件,命令会去读这个配置文件里的东西。我们打开spring.factories文件 , 看到了很多自动配置的文件;这就是自动配置根源。
      3. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作。以前我们需要自己配置的东西 , 自动配置类都帮我们解决了。
      4. 真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。

二.2.2. run方法

  1. 主方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

    1. SpringApplication的实例化

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

找出所有的应用程序监听器,设置到listeners属性中
4. 推断并设置main方法的定义类,找到运行的主类

  1. run方法的执行
    在这里插入图片描述

posted on 2019-08-12 11:37  小呀嘛小啊侠  阅读(...)  评论(...编辑  收藏

统计