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方法流程分析

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

浙公网安备 33010602011771号