SpringBoot:运行原理初探

 

 

 maven插件下载失败了这边可以直接install

在官网上查看依赖版本

 

 

 

 

 

 查看扩展jar包

 

 

 

1.1、父依赖

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

<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的版本控制中心;

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

1.2、启动器 spring-boot-starter

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

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

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

2.1、默认的主启动类

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

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

其实这里的核心就是用了javaConfig @Configuraion(配置类) @Bean(组件)

在这里之所以打的jar包可以使用不是说放在tomcat里来使用而是看作了一个进程,每一个都看作的是一个进程

这里涉及到的也就是Docker

3.1、配置文件

可以创建如下两种,并且名字都必须为application,都放在sources目录下

 

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>

 

3.2、 三种方式注入配置文件

3.4.1、value注解方式

@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() {
}
}

3.4.1、yaml配置文件方式

 

 

 

 这里报红你就引入这个依赖:

<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

 3.4.2、properties配置文件方式(springboot不建议你使用)

 

 

 3.4.2、配置文件的占位符

配置文件还可以编写占位符生成随机数

person:
  name: qinjiang${random.uuid} # 随机uuid
  age: ${random.int}  # 随机int
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    name: ${person.hello:other}_旺财
    age: 1

 

 

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

 

posted @ 2020-12-30 11:01  Yaoyaoo  阅读(253)  评论(0)    收藏  举报