详解 Spring Boot 项目中的配置文件

点进来你就是我的人了
博主主页:戳一戳,欢迎大佬指点!

欢迎志同道合的朋友一起加油喔

详解 Spring Boot 项目中的配置文件_第1张图片


目录

1. Spring Boot 项目中配日文件的作用是什么

2. Spring Boot 配置文件的两种格式

1. properties的语法

2. yml的语法

3. properties与yml的对比

4. 设置不同环境下的配置文件

3. 更多的系统配置项



1. Spring Boot 项目中配日文件的作用是什么

配置文件中最主要的两个作用: 连接数据库和用于定位问题的关键日志.

  • 一个项目中没有数据库的话那就谈不上一个完整的项目.
  • 假设你正在使用一个在线购物网站。你在购物车里放了一些想买的东西,准备稍后结账。但如果这个网站没有数据库来保存这些信息,你可能会发现当你回来时,购物车里的物品都不见了。
  • 另一方面,如果这个网站没有配置文件,那么在出现问题时,开发人员可能会很难找出问题的原因。例如,如果支付系统突然出现故障,没有配置文件的话,可能就难以追踪到具体出了什么问题。

配置文件的作用:

  • 连接数据库的信息
  • 用于发现和定位问题的关键日志
  • 设置项目的启动端口
  • 第三方系统的调用密钥等信息 (例如老师在某平台给我们上课时, 他能在平台上拿到我们的数据, 就是通过配置文件中设置的标识来调用第三方接口获取的)

2. Spring Boot 配置文件的两种格式

Spring Boot 中有两种格式的配置文件:

  • properties  (application.properties) (Spring Boot项目创建时默认的格式)
  • yml / ymal (application.yml)

Spring Boot 中这两种格式的配置文件的命名方式必须以 application 开头,  否则配置就不会生效, 这就牵扯到了高级框架中的 "约定大于配置" , 我们要做的事情越来越少了, 但是要遵守的约定越来越多了.

【问题】为什么需要两种格式的配置文件呢 ? 仅仅是为了提供更多的选择 ?

1. yml 相比于 properties 在写法上简化了许多 (后面会演示代码)

2. 在跨平台等问题上也是有很大的优势 (后面会讲到)

【问题】两种格式的配置文件如果同时存在, 会以哪种格式为主?

1. 当一个项目中出现了两种格式的配置文件时, properties 格式的配置文件优先级高, 所以会以 properties 格式的配置文件为主. 例如 properties 配置文件中设置了端口为 8081, .yml 配置文件中也设置了端口, 为 8082, 那么最终程序启动时的端口就是 8081, 但是加载完 properties 文件之后, 也会加载 .yml 文件中的配置信息.

2.理论上是这两种格式的配置文件可以出现在一个项目中, 但是一般都会统一配置文件,如果两种格式都写了, 可能会有增加排查问题的风险; 就好比衣服种类有很多, 但是一个餐厅里的服务员一般都会统一服装, 否则会显得杂乱无章, 不正式

1. properties的语法

properties以键值的形式配置,键和值中间用 = 连接起来(key=value),配置文件中的 # 代表注释信息

# 配置系统端口
server.port=8082
# 配置数据库源
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/blog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456

这些配置都属于系统配置项(给Spring框架用),用户还可以自定义配置项(可在程序中用)

用户自定义配置

# 自定义配置
name=张三
age=20

在程序中如何读取自定义的配置项呢?

使用 @Value(“${ xxx }”) 的方式可读取用户自定义的配置

@Value("${name}")
private String name;
@Value("${age}")
private int age;

读取的时候,自定义与系统的配置项都可以获取到

【代码实例】

@Controller
@ResponseBody  //加在类上, 表示当前类中的所有方法返回的都是非静态页面的数据
public class TestController {
    //读取用户自定义的配置
    //一定要是${key}格式
    @Value("${name}")
    private String name;

    @Value("${age}")  // 读取用户自定义的配置
    private String age;

    @Value("${server.port}")  //读取系统配置项
    private int port;
    @RequestMapping ("/sayHi")   // = WebServlet("/URL")  
    public String sayHi() {
        return "hello world " + "->" + name + age + " port = " + port;
    }
}

浏览器输入url(http://localhost:9090/sayHi)之后显示结果如下: 

properties的优缺点

  • 优点:是系统的默认的配置文件格式,优先级更高
  • 缺点:写法比较冗余

2. yml的语法

yml是yaml的缩写,它的语法格式为 key: value,其中冒号为英文格式,并且value与冒号中间的空格不可省略

# 系统端口号
server:
  port: 8083
# 数据库源信息
spring:
  datasource:
    username: root
    password: 123456

yml支持更多的数据类型

# 字符串
str1: 你好 \n 你好
str2: '你好 \n 你好'
str3: "你好 \n 你好"

# 布尔值
flag1: true
flag2: false

# 整数
num: 10

# 浮点数
pai: 3.14

# null ~代表null
Node: ~

读取的方式与properties格式相同,使用@Value("${ xxx }")

@Component
public class TestYml {
    @Value("${str1}")
    private String str1;
    @Value("${str2}")
    private String str2;
    @Value("${str3}")
    private String str3;
    @Value("${num}")
    private int num;
    @Value("${flag1}")
    private boolean flag1;
    @Value("${flag2}")
    private boolean flag2;
    @Value("${pai}")
    private double pai;
    @Value("${node}")
    private String node;

    //该注解代表构造方法,初始化bean的时候会调用该方法
    @PostConstruct
    public void construct(){
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(num);
        System.out.println(pai);
        System.out.println(flag1);
        System.out.println(flag2);
        System.out.println(node);
    }
}

打印结果:

详解 Spring Boot 项目中的配置文件_第2张图片

 从上述字符串的打印发现:

  • 字符串默认可以不用加引号
  • 加单引号,会对特殊字符进行转义,也就是特殊字符也当字符串对待了
  • 加双引号,不会对特殊字符转义,也就是特殊字符有自己的特殊含义,\n代表换行

yml配置对象

# 对象
student1:
  id: 1
  name: 张三
  age: 10
# 对象的行内表示
student2: {id: 2,name: 李四, age: 15}

读取对象使用 @ConfigurationProperties 注解

@Component
@ConfigurationProperties("student1")//这里不需要使用$
@Getter
@Setter //这里是通过set方法赋值属性的,提供set方法
@ToString
public class Student {
    //字段与yml里的名称相同
    private int id;
    private String name;
    private int age;
}

测试类:

@Controller
public class StudentController {
    @Autowired
    private Student student;
    
    @PostConstruct
    public void printStu(){
        System.out.println(student);
    }
}

打印结果:详解 Spring Boot 项目中的配置文件_第3张图片

yml配置list集合

# list集合
nametype:
  name:
    - 张三
    - 李四
@Component
@ConfigurationProperties("nametype")
@Setter
@Getter
@ToString
public class TestList {
    private List name;
}
@Controller
public class ListController {
    @Autowired
    private TestList testList;


    @PostConstruct
    public void printList(){
        System.out.println(testList);
    }
}

打印结果:详解 Spring Boot 项目中的配置文件_第4张图片

yml的优点

  • 写法简单,易于理解
  • 支持更多的数据类型,如数组,对象等
  • 支持更多的编程语言,Java,Python,Glang等

3. properties与yml的对比

  • 格式不同,properties是以key=value的格式,yml是以key: value的格式,并且层级之间使用换行缩进方式配置,vlaue与:之间的空格不可省略
  • properties配置存在冗余,yml很好的解决冗余问题
  • properties是项目默认的配置文件格式,yml是后面新的一种配置格式
  • yml的通用性更好,支持更多的语言
  • yml支持更多的数据类型

4. 设置不同环境下的配置文件

一般项目分为三个环境:

  1. 开发环境
  2. 测试环境
  3. 上线运行环境

 在实际的项目开发过程中,我们可能有测试环境、开发环境、部署环境,这些环境下使用的数据库连接或者项目启动的端口号可能都不太相同,只有一份配置文件,如果在不同的环境下运行程序的话就需要我们频繁地去修改配置文件,如果修改的配置项目少还好;如果多呢?不仅效率低,还可能出错。那么我们应该怎么解决这种这种问题呢?

环境不同可能配置项存在差异,如数据库源,端口号不同等差异

我们可以使用如下配置文件的方式解决:

  • 相同公共的配置放在application.yml(.properties)中
  • 不同环境的配置文件放在application-xxx.yml(.properties)中(xxx可以为任意名字)
  • 一般使用pro为线上环境,dev为开发环境,test为测试环境

在公共的配置文件中(application.yml)添加如下配置项:

# 设置配置文件的运行平台
spring:
  profiles:
    active: dev

示例:开发环境端口要求4567,测试环境端口要求5678,线上环境端口要求1234

详解 Spring Boot 项目中的配置文件_第5张图片

  • 如果改变环境,只需要更改主配置文件application.yml中的配置项spring.profiles.active即可
  • active 后面写 prod, test 和 dev, 就表示当前主配置文件要搭配那个运行环境来使用.

3. 更多的系统配置项

链接: 点击获取更多的系统配置项

你可能感兴趣的:(java,spring,boot,spring)