SpringBoot

什么是Springboot

Springboot其实就是基于Spring框架的扩展,相当于Spring那些基于XML文件的繁琐配置,SpringBoot开发更加快速便捷,同时还使用了内嵌式的Tomcat服务容器,提供了Starters来简化项目的构建配置,同时来尽可能的自动配置Spring应用。

总结:SpringBoot就是使编码变简单、配置变简单、部署变简单、监控变简单…

起步依赖

spring-boot-starter-parent

创建一个SpringBoot项目后,打开pom.xml配置文件会有如下代码

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

点开 spring-boot-starter-parent 出现另一个配置文件,然后有如下代码

1
2
3
4
5
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.4</version>
</parent>

再次点开 spring-boot-dependencies 就会有一个依赖配置文件,里面有个

称为版本控制锁定,当继承了这个配置文件时就不需要指定对应依赖的版本,而这些依赖的版本也是经过测试的,相互之间不会造成冲突,因此为项目的配置提供了很大的便利。

spring-boot-starter-web

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

点击 spring-boot-starter-web 会有一个springboot Web开发的依赖配置文件,里面定义了了Web开发需要的一些依赖坐标信息,因此只要依赖于在这个文件,根据依赖的传递,因此就可以间接的导入这些依赖,而不用自己一个一个去导入,简化了项目的配置。

starter场景启动器

对于依赖 spring-boot-starter-* : * 就代表着某种场景,只要引入starter,这个场景的所有常规需要的依赖我们都自动引入。

支持的场景有:Starters

如果需要修改项目依赖的版本号

例如:需要修改mysql连接驱动的版本号

  • 首先查看spring-boot-dependencies里规定当前依赖的版本用的 key

    1
    <mysql.version>8.0.26</mysql.version>
  • 然后在当前项目的配置文件里重写

    1
    2
    3
    <properties>
    <mysql.version>5.1.43</mysql.version>
    </properties>

自动配置

引入spring-boot-web 场景启动器的时候,已经自动引入Tomcat依赖,和SpringMVC依赖,自动配置好了常用的组件。

默认的组件配置扫描

  • 主程序所在的包及其下面的子包里面的组件都会被默认扫描进ConfigurableApplicationContext(一个IOC容器)

  • 如果想要改变扫描路径

    • @SpringBootApplication(scanBasePackages=“包名”)

      1
      @SpringBootApplication(scanBasePackages="com.xiamu")
    • 或者使用注解@ComponentScan 指定扫描路径

      1
      @ComponentScan("com.xiamu")
    • 因此

      1
      2
      3
      4
      5
      @SpringBootApplication
      等同于
      @SpringBootConfiguration
      @EnableAutoConfiguration
      @ComponentScan("com.xiamu")

注解说明

@Configuration

相当于传统的xml配置文件,

如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类,可以使用@ImportResource注解加载xml配置文件。

beans.xml 配置文件

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="uu" class="com.xiamu.springbootstudy.Model.User">
<property name="name" value="夏目"/>
<property name="age" value="24"/>
</bean>
</beans>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@ImportResource(locations = "classpath:beans.xml")//加载xml配置文件
@Configuration //告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig {
@Bean //给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public User user(){
User u = new User("xiamu", 18);
return u;
}
}

//测试
@SpringBootApplication
public class SpringbootStudyApplication {

public static void main(String[] args) {
// SpringApplication.run(SpringbootStudyApplication.class, args);

//1、返回我们IOC容器
ConfigurableApplicationContext run = SpringApplication.run(SpringbootStudyApplication.class, args);

User user = run.getBean("user", User.class);
System.out.println(user.getName() + " " + user.getAge());

User uu = run.getBean("uu", User.class);
System.out.println(uu.getName() + " " + uu.getAge());
}
}

测试结果

image-20211207160517767

配置文件分类

properties

application.properties

1
2
server.port=8080
server.address=127.0.0.1

yml/yaml

application.yml/application.yaml

语法:

  • 大小写敏感
  • 数据值前面必须有空格作为分隔符
  • 缩进不能使用Tab键用空格
  • 使用缩进表示层级关系
  • #表示注释

数据格式

  • 对象(map):键值对的集合

    1
    2
    3
    4
    5
    6
    user:
    name: xiamu
    age: 22
    address:
    - beijing
    - shanghai
    • 参数引用

      1
      2
      3
      name: xiamu
      user:
      name: ${name}
  • 数组:一组按次序排列的值

    1
    2
    3
    address:
    - beijing
    - shanghai
  • 纯量:单个的、不可再分的值

    1
    2
    msg: 'hello \n world' # 单引号忽略转义字符 (原样输出)
    msg: "hello \n world" # 双引号识别转义字符 (换行输出)
1
2
3
server:
port: 8080
address: 127.0.0.1

配置文件加载顺序优先级:properties > yml > yaml

对于同一个属性的配置,优先读取优先级最高的文件中该属性的配置信息。

配置文件数据获取

@Value注解

1
2
3
4
5
6
7
8
@Value("${name}")
String name;

@Value("${user.age}")
int age;

@Value("${address[0]}")
String address;

Environment对象

1
2
3
4
5
@Autowired
Environment env;

String name = env.getProperty("user.name");
String address = env.getProperty("address[0]");

@ConfigurationProperties注解

1
2
3
4
5
6
7
@Component
@ConfigurationProperties(prefix = "user")
public class User{
private String name;
private int age;
private String[] address
}

profile

在开发SpringBoot应用时,程序会被安装到不同的环境下,例如:开发、测试、生产等。其中在不同的环境下,数据库地址,服务端口等等配置都不同,因此每次打包时都需要修改配置文件,这样及其麻烦,而profile功能就可以进行动态的配置切换。

profile配置方式:

  • 多profile文件方式
  • yml多文档方式

profile激活方法:

  • 配置文件
  • 虚拟机参数
  • 命令行参数

配置方式

(多profile文件方式)

有三种不同环境的配置文件application-名称不限制

  • application-dev.properties
  • application-pro.properties
  • application-test.properties

我们可以在application.properties文件中激活某个环境配置文件

1
spring.profiles.active=dev

或者将其写在同一个配置文件中(yml多文档方式) **—**分隔不同配置信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---
server:
port: 8081
spring:
profiles: dev

---
server:
port: 8082
spring:
profiles: pro

---
server:
port: 8083
spring:
profiles: test

---
spring:
profiles:
active: dev

激活方法

  • 配置文件

    1
    2
    3
    spring:
    profiles:
    active: dev
    1
    spring.profiles.active=dev
  • 虚拟机参数

VM options: -Dspring.profiles.active-dev

  • 命令行参数

Program arguments: –spring.profiles.active=pro

  • 打包方式
image-20211229155135248

打包完后运行java jar包

image-20211229160232457 image-20211229160401292

这样就运行成功了,端口号为8080

可以使用一下命令来进行环境配置的切换

java -jar .\springboot-study-0.0.1-SNAPSHOT.jar –spring.profiles.active=dev

配置文件加载顺序

image-20211229160955528

也可以在项目打包后,加载其他配置文件来运行项目

java -jar .\springboot-study-0.0.1-SNAPSHOT.jar –spring.config.location=配置文件路径

image-20211229161713620

如果其他配置文件application.propertiesjar包在同级目录下,则默认会被加载。

或者在项目target目录下新建一个config目录,则该目录下的配置文件也会被默认加载。

这种方式的好处有:当我们发现项目中的某些配置信息有误时,可以通过外部配置文件覆盖的方式来进行纠错。