SpringBoot:运行原理初探

maven插件下载失败了这边可以直接install
在官网上查看依赖版本


查看扩展jar包


其中它主要是依赖一个父项目,主要是管理项目的资源过滤及插件!
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
点进去,发现还有一个父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心;
以后我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
springboot-boot-starter-xxx:就是spring-boot的场景启动器
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
package com.yao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//@SpringBootApplication:标志这个类是一个springboot的应用 兜兜转转就是做到启动类下的所有资源被导入
@SpringBootApplication
public class Springboot01HelloworldApplication {
public static void main(String[] args) {
//一看这个run通过类名调用它是一个静态方法将springboot应用启动,说白了就是如下:
//1.SpringApplication类
//run方法
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}

要用的组件其实都在这个里面

我最初以为就是运行了一个main方法,没想到却开启了一个服务;
分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
2.2、SpringApplication
这个类主要做了以下四件事情:
1、推断应用的类型是普通的项目还是Web项目,就是去看它是否导入了mvc配置以及内置的tomcat
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
查看构造器:
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
// ......
this.webApplicationType = WebApplicationType.deduceFromClasspath();
this.setInitializers(this.getSpringFactoriesInstances();
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = this.deduceMainApplicationClass();
}
2.3、run方法流程分析
跟着源码和这幅图就可以一探究竟了!
其实这里的核心就是用了javaConfig @Configuraion(配置类) @Bean(组件)
在这里之所以打的jar包可以使用不是说放在tomcat里来使用而是看作了一个进程,每一个都看作的是一个进程
这里涉及到的也就是Docker

application.properties: 这里官方也不推荐使用这个
# springboot 这个配置文件中到底可以配置那些东西
# 官方的配置太多了,了解原理,一通百通
#properties只能保存键值对
name=yaoyao
student.name = yaoyao
student.age = 13
对应的application.yaml:
server:
port: 8081
# k=v 普通的key-value
name: yaoyao
#可存放对象
student:
name: yaoyao
age: 3
student02:
name02:
age02: 3
#对空格的要求十分高
#行内写法
student: {name: yayao,age: 3}
#数组
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
#强大之处注入到我们的配置类当中
以上两种对应传统xml配置:
<server>
<port>8081<port>
</server>
@Component//跟启动类一样添加到组件当中
public class Dog {
@Value(" 旺财")//value注解用来赋值
private String name;
private Integer age;
@Value("3")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
public Dog() {
}
}

这里报红你就引入这个依赖:
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
person

这里配置了这个happy才可以用到它



浙公网安备 33010602011771号