2022.6.8 原理初探

3、原理初探

我们之前写的HelloSpringBoot,到底是怎么运行的呢,Maven项目,我们一般从pom.xml文件探究

1、父依赖

其中它主要是依赖一个父项目,主要是管理项目的资源过滤及插件!

1  <parent>
2      <groupId>org.springframework.boot</groupId>
3      <artifactId>spring-boot-starter-parent</artifactId>
4      <version>2.2.5.RELEASE</version>
5      <relativePath/> <!-- lookup parent from repository -->
6  </parent>

点进去,发现还有一个父依赖

1  <parent>
2      <groupId>org.springframework.boot</groupId>
3      <artifactId>spring-boot-dependencies</artifactId>
4      <version>2.2.5.RELEASE</version>
5      <relativePath>../../spring-boot-dependencies</relativePath>
6  </parent>

这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心;

以后我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了;

2、启动器 spring-boot-starter

1  <dependency>    
2     <groupId>org.springframework.boot</groupId>        
3     <artifactId>spring-boot-starter</artifactId>
4  </dependency>

springboot-boot-starter-xxx:就是spring-boot的场景启动器

例如spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;

SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;

3、默认的主启动类

 1 //@SpringBootApplication 来标注一个主程序类
 2  //说明这是一个Spring Boot应用
 3  @SpringBootApplication
 4  public class SpringbootApplication {
 5  6     public static void main(String[] args) {
 7       //将springboot应用启动,以为是启动了一个方法,没想到启动了一个服务
 8        SpringApplication.run(SpringbootApplication.class, args);
 9     }
10 11  }

但是一个简单的启动类并不简单!我们来分析一下这些注解都干了什么

1、@SpringBootApplication

作用:标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

进入这个注解:可以看到上面还有很多其他注解!

1 @SpringBootConfiguration :springboot的配置
2      @Configuration:spring配置类
3          @Component:说明这也是一个spring组件
4  @EnableAutoConfiguration:自动配置
5      @AutoConfigurationPackage:自动配置包
6          @Import({Registrar.class}):自动配置包注册
7      @Import({AutoConfigurationImportSelector.class}):自动配置导入选择

结论: springboot所有自动配置都是在启动的时候扫描并加载: spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!

2、Run

我最初以为就是运行了一个main方法,没想到却开启了一个服务;

 1 package com.xing;
 2  3  import org.springframework.boot.SpringApplication;
 4  import org.springframework.boot.autoconfigure.SpringBootApplication;
 5  6  @SpringBootApplication
 7  public class Springboot01HellowordApplication {
 8      public static void main(String[] args) {
 9          //该方法返回一个configurableApplicationcontext对象
10          //参数一:应用入口的类        参数类:命令行参数
11          SpringApplication.run(Springboot01HellowordApplication.class, args);
12      }
13 14  }

SpringApplication.run分析

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

3、SpringApplication

这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

查看构造器:

1  public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
2      // ......
3      this.webApplicationType = WebApplicationType.deduceFromClasspath();
4      this.setInitializers(this.getSpringFactoriesInstances();
5      this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
6      this.mainApplicationClass = this.deduceMainApplicationClass();
7  }

4、run方法流程分析

 

跟着源码和这幅图就可以一探究竟了!

posted @ 2022-06-10 10:35  暴躁C语言  阅读(34)  评论(0)    收藏  举报