【JavaEE】 spring boot的配置文件详解

spring boot的配置文件详解

文章目录

  • spring boot的配置文件详解
    • 常用配置
    • spring boot的配置文件
      • 1. properties 文件
      • 2. YAML 文件
      • 3. 多环境配置
      • 4. 配置文件优先级
      • 5. 配置属性注入
      • 特殊说明
    • properties配置文件
      • 基本语法
    • 例子
      • peoperties文件的缺点
    • YML配置文件
    • YML使用
      • yml 配置不同数据类型及 null
        • 注意事项
      • 配置对象
      • 配置集合
      • 配置map
      • YML 的优缺点
        • 优点
        • 缺点

常用配置

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  mvc:
    favicon:
      enable: false
  profiles:  #多平台配置
    active: dev
# 设置 Mybatis 的 xml 保存路径
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true  #自动驼峰转换
# 配置打印 MyBatis 执行的 SQL
logging:
  file:
    name: logs/springboot.log
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
  level:
    com:
      example:
        demo: debug

spring boot的配置文件

SpringBoot⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的

⽬的.

很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:

  • 项⽬的启动端⼝
  • 数据库的连接信息(包含⽤⼾名和密码的设置)
  • 第三⽅系统的调⽤密钥等信息
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等.

在idea中我们修改 application.properties ⽂件即可。

Spring Boot 配置文件详解

在 Spring Boot 中,配置文件是管理应用程序配置的重要组成部分。它可以用来配置应用程序的各种属性,包括数据库连接、日志级别、端口号等。Spring Boot 支持多种类型的配置文件,包括 properties 文件、YAML 文件等。本文将详细介绍 Spring Boot 配置文件的使用方法和常见配置项。

1. properties 文件

示例:application.properties

# 设置应用程序端口号
server.port=8080

# 配置数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=root

# 配置日志级别
logging.level.org.springframework=INFO

2. YAML 文件

YAML和YML文件是一样的。

示例:application.yaml

# 设置应用程序端口号
server:
  port: 8080

# 配置数据库连接
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydatabase
    username: root
    password: root

# 配置日志级别
logging:
  level:
    org:
      springframework: INFO

3. 多环境配置

示例:application-{profile}.properties 或 application-{profile}.yaml

# 开发环境配置
# application-dev.properties

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/dev_database
spring.datasource.username=root
spring.datasource.password=root
# 生产环境配置
# application-prod.properties

server.port=80
spring.datasource.url=jdbc:mysql://localhost:3306/prod_database
spring.datasource.username=admin
spring.datasource.password=admin

4. 配置文件优先级

Spring Boot 配置文件的优先级顺序如下:

  1. 命令行参数:使用命令行参数可以覆盖配置文件中的属性。
  2. 内置默认值:Spring Boot 内置了许多默认属性,如果没有在配置文件中指定,则会使用这些默认值。
  3. 当前目录下的 config 文件夹:Spring Boot 会在当前目录下的 config 文件夹中查找配置文件。
  4. 当前目录:Spring Boot 会在当前目录中查找配置文件。
  5. classpath 下的 /config 文件夹:Spring Boot 会在类路径下的 /config 文件夹中查找配置文件。
  6. classpath 根目录:Spring Boot 会在类路径的根目录下查找配置文件。
  7. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5. 配置属性注入

Spring Boot 支持在配置文件中定义属性,并使用 @Value 注解将属性值注入到 Java 类中。

示例:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Value("${myapp.message}")
    private String message;

    public void displayMessage() {
        System.out.println("Message from properties file: " + message);
    }
}

在配置文件中设置 myapp.message=Hello, World!,则 message 属性的值会被注入为 “Hello, World!”。

特殊说明

  1. 理论上讲 .properties.yml 可以并存在于⼀个项⽬中,当 .properties.yml

并存时,两个配置都会加载. 如果配置⽂件内容有冲突, 则以 .properties 为主, 也就是.properties 优先级更⾼.

  1. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种

统⼀的配置⽂件格式,这样可以更好的维护 (降低故障率)

properties配置文件

配置文件官网可参考学习

基本语法

Properties 文件是一种常见的配置文件格式,用于存储键值对形式的配置信息。它通常用于配置应用程序的参数、属性、设置等。下面是 Properties 文件的语法:

  1. 键值对:Properties 文件由多个键值对组成,每个键值对由键和值组成,中间用等号连接,如:key=value

  2. 注释:可以在 Properties 文件中添加注释,以 #! 开头的行被视为注释,不会被解析。

  3. 空行:空行会被忽略,不会被解析。

  4. 转义字符:可以使用反斜杠 \ 进行转义,表示特殊字符的转义,如 \n 表示换行符。

  5. Unicode 编码:可以使用 Unicode 编码表示非 ASCII 字符。

下面是一个简单的 Properties 文件示例:

# This is a sample properties file

# Database configuration
db.url=jdbc:mysql://localhost:3306/mydatabase
db.username=admin
db.password=123456

# Server configuration
server.port=8080
server.host=localhost

在这个示例中,我们定义了数据库和服务器的配置信息,每个键值对代表一个配置项,键表示配置项的名称,值表示配置项的值。注释以 # 开头,表示注释内容。

例子

# 项目常用端口号
server.port=8080
# 配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# 自定义一些配置
ben.key1=ben666
ben.key2=789
package org.haobin.ioc.demo.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 刘浩彬
 * @date 2024/2/25
 */

@RestController
@RequestMapping("/prop")
public class PropertiesController {
    @Value("${ben.key1}")
    private String key1;

    @Value("${ben.key2}")
    private Integer key2;

    @RequestMapping("/readValue")
    public String readValue(){
        return "从Properties读取配置文件,key1:"+key1;
    }

    @RequestMapping("/readValue2")
    public String readValue2(){
        return "从Properties读取配置文件,key2:"+key2;
    }
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

peoperties文件的缺点

虽然 Properties 文件在很多情况下都是一种方便的配置方式,但也存在一些缺点,包括:

  1. 扩展性差:Properties 文件的结构简单,只支持键值对形式的配置,无法表示复杂的数据结构,如列表、嵌套对象等,因此在需要表示复杂配置信息时,会显得不够灵活。

  2. 类型转换不方便:Properties 文件中的值都是字符串形式,无法直接表示其他类型的数据,比如整数、浮点数、布尔值等。在读取配置时,需要手动进行类型转换,增加了开发的复杂度和出错的可能性。

  3. 不支持注释嵌套:Properties 文件的注释只能位于行首,无法在行内或值之后添加注释。这样的限制可能会导致注释和配置项的关系不够清晰,不利于代码的维护和阅读。

  4. 不支持环境变量替换:Properties 文件无法直接引用环境变量,需要借助外部工具或框架来实现环境变量的替换,增加了配置的复杂度。

  5. 不支持多语言:Properties 文件中的配置项只能使用一种语言表示,无法方便地支持多语言配置,这在国际化的应用程序中可能会造成不便。

YML配置文件

yml 是树形结构的配置⽂件,它的基础语法是"key: value".

key 和 value 之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略YAML(YAML Ain’t Markup Language)是一种人类友好的数据序列化格式,常用于配置文件和数据交换。YAML 文件采用缩进和空格来表示层次结构,具有清晰简洁、易读易写的特点。下面是 YAML 配置文件的主要语法:

  1. 基本规则

    • YAML 文件以 .yml.yaml 扩展名结尾。
    • 使用缩进表示层次结构,缩进时只能使用空格,不能使用制表符。
    • 使用 # 符号表示注释,注释可以单独一行或在行尾。
  2. 键值对

    • 使用冒号 : 将键和值分隔开。
    • 键值对可以写在同一行,也可以换行写,但冒号后必须跟一个空格。
  3. 列表

    • 使用连字符 - 表示列表项。
    • 列表项可以是简单值,也可以是对象或其他列表。
  4. 对象

    • 对象使用缩进表示层次结构,每个属性都是键值对形式。
    • 对象的属性可以是简单值,也可以是嵌套的对象或列表。
  5. 引号

    • 字符串值可以使用单引号 ' ' 或双引号 " " 包裹,也可以省略引号。
    • 使用引号可以保留字符串的空白字符或特殊字符。
  6. 多行字符串

    • 使用 | 符号表示多行字符串,保留换行符和缩进。
    • 使用 > 符号表示多行字符串,忽略换行符,但保留缩进。
  7. 特殊值

    • truefalsenull 分别表示布尔值 true、false 和空值。

下面是一个简单的 YAML 示例:

# YAML 示例配置文件

server:
  port: 8080
  hostname: localhost

database:
  url: jdbc:mysql://localhost:3306/mydb
  username: root
  password: password

logging:
  level:
    root: info
    com.example: debug

profiles:
  - dev
  - test
  - prod
server:
  port: 9090

spring:
  datasource:
    url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root

YML使用

yml 配置不同数据类型及 null

server:
  port: 9090

spring:
  datasource:
    url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
    username: root
    password: root

# 自定义配置项
string.value: ben666
string:
  value2: ben22222222
package org.haobin.ioc.demo.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/yml")
public class ymlController {
    @Value("${string.value}")
    private String value;

    @Value("${string.value2}")
    private String key2;

    @Value("${spring.datasource.url}")
    private String url;

    @RequestMapping("/readValue")
    public String readValue() {
        return "从yml读取配置文件,value:" + value;
    }

    @RequestMapping("/readValue2")
    public String readValue2() {
        return "从yml读取配置文件,key2:" + key2;
    }

    @RequestMapping("/url")
    public String readUrl() {
        return "从yml读取配置文件,url:" + url;
    }
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# 如果使用字符串接收,字符串的值是 ~

# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value:
注意事项

value 值加单双引号

字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。

尝试在 application.yml 中配置如下信息

string:
 str1: Hello \n Spring Boot.
 str2: 'Hello \n Spring Boot.'
 str3: "Hello \n Spring Boot."
@Value("${string.str1}")
        private String str1;
        @Value("${string.str2}")
        private String str2;
        @Value("${string.str3}")
        private String str3;
        @RequestMapping("/yml")
        public String readYml(){
            System.out.println(str1);
            System.out.println(str2);
            System.out.println(str3);
            return "yml";
        }

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上述结果可以看出:

  • 字符串默认不⽤加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
  • 双引号不会转义字符串⾥⾯的特殊字符, 特殊字符会表⽰本⾝的含义.

此处的转义理解起来会有些拗⼝, \n 本意表⽰的是换⾏

使⽤单引号会转义, 就是说, \n 不再表⽰换⾏了, ⽽是表⽰⼀个普通的字符串

使⽤双引号不会转义, 表⽰ \n 表⽰的是它本⾝的含义, 就是换⾏


配置对象

@Autowired
private Student student;

@RequestMapping("/stu")
public String readStu(){
    return student.toString();
}
package org.haobin.ioc.demo.model;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
    private Integer id;
    private Integer age;
    private String name;
}
student:
  id: 1
  name: java
  age: 18

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


配置集合

配置⽂件也可以配置 list 集合,如下所⽰:

dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

注意点

dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

如果- mysql中的空格省略了,不会报错。但是含义是变了的,这几个元素就会被当做一个元素来处理

集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:

@Component
@Data
@ConfigurationProperties("dbtypes")
public class Dbtypes {
    private List<String> name;
}

访问集合的实现如下:

@Autowired
private Dbtypes dbtypes;

@RequestMapping("/list")
public String readList(){
    return dbtypes.toString();
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置map

道理和配置list一样

不做解释,给示例代码如下:

maptypes:
  map:
    k1: kk1
    k2: kk2
    k3: kk3
@Component
@Data
@ConfigurationProperties("maptypes")
public class Maptypes {
    private HashMap<String, String> map;
}
@Autowired
private Maptypes maptypes;

@RequestMapping("/map")
public String readMap(){
    return maptypes.toString();
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

YML 的优缺点

优点
  1. 易读性高

    • YML 使用缩进和空格来表示层次结构,与传统的大括号和逗号相比,更接近自然语言,更易于理解和阅读。
    • YML 文件结构清晰简洁,注重可读性,适合人类阅读和编辑。
  2. 简洁清晰

    • YML 使用简洁的语法,可以轻松地表示复杂的数据结构,如列表、对象和多行字符串,使配置文件更加简洁明了。
  3. 可扩展性

    • YML 具有灵活的语法和结构,可以轻松地扩展和调整配置文件的内容,适用于各种类型的应用场景和需求。
  4. 与多种编程语言兼容

    • YML 格式与多种编程语言兼容,包括 Java、Python、JavaScript 等,可以方便地在不同语言环境中使用和解析。
缺点
  1. 空格敏感

    • YML 的语法对空格敏感,缩进和空格的使用必须严格遵循规范,否则可能会导致解析错误或意外结果。
  2. 复杂性

    • 随着配置文件的复杂度增加,YML 文件的结构也可能变得复杂,不易于管理和维护,尤其是对于大型项目。
  3. 不适合所有场景

    • 尽管 YML 在配置文件和数据交换方面表现良好,但并不适合所有场景。对于某些特定需求或环境,可能存在更合适的选择。
  4. 缺乏严格的规范

    • YML 并没有像 JSON 那样严格的规范,不同的实现可能存在细微差异,可能会导致不同解析器之间的兼容性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/409482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云-系统盘-磁盘扩容

阿里云系统磁盘扩容 之前是测试环境磁盘用的默认的有 40G&#xff0c;后面升级到正式的 磁盘怕不够用打算升级到 100G&#xff0c; 系统镜像&#xff1a; Alibaba Cloud Linux 3.2104 LTS 64 位 磁盘 ESSD 40G 升级步骤&#xff1a; 扩容与创建快照 在阿里云后台首先去扩容…

【Docker】三、日志控制

三、日志控制 使用Docker部署服务器&#xff0c;要对Docker日志定时处理。否则&#xff0c;服务器运行一段时间后&#xff0c;磁盘占比报警。 出现磁盘占比报警&#xff0c;大概率是大文件的问题&#xff0c;可查看服务器中的大文件&#xff0c;排除问题。 &#xff08;一&am…

apache 模式、优化、功能 与 nginx优化、应用

一、I/O模型——Input/Output模型 1.同步/异步 A程序需要调用B程序的某一个功能&#xff0c;A发送一个请求需要B完成一个任务 同步&#xff1a;B不会主动去通知A是否完成需要A自己去问 异步&#xff1a;B会主动通知A是否完成 2.阻塞/非阻塞 A发送一个请求需要B完成一个任务 …

Python文件和异常(二)

目录 三、异常 &#xff08;一&#xff09;处理 ZeroDivisionError 异常 &#xff08;二&#xff09;使用 try-except 代码块 &#xff08;三&#xff09;使用异常避免崩溃 &#xff08;四&#xff09;else 代码块 &#xff08;五&#xff09;处理 FileNotFoundError 异常…

单片机05__串口USART通信__按键控制向上位机传输字符串

串口USART通信 通用UART介绍 1.通信的概念 计算机与外界进行信息交换的过程称之为通信。 在通信的过程中&#xff0c;通信双方都需要遵守的规则称之为通信协议。 硬件协议&#xff1a;将数据以什么样的方式传输过去 软件协议&#xff1a;将数据以什么样的顺序传输过去 2.常用…

042 继承

代码实现 首先定义Person类&#xff08;人类&#xff09; /*** 人的基础特征** author Admin*/ public class Person {/*** 姓名*/String name;/*** 生日*/Date birthday;/*** 手机号码*/String tel;/*** 身份证号码*/String idCode;public Person() {}public Person(String …

BlackberryQ10 是可以安装 Android 4.3 应用的,Web UserAgent 版本信息

BlackberryQ10 是可以安装 Android 4.3 应用的 最近淘了个 Q10 手机&#xff0c;非常稀罕它&#xff0c;拿着手感一流。这么好的东西&#xff0c;就想给它装点东西&#xff0c;但目前所有的应用都已经抛弃这个安卓版本了。 一、开发环境介绍 BlackBerry Q10 的 安卓版本是 4.…

Spring Boot对接RocketMQ示例

部署服务 参考RocketMq入门介绍 示例 引入maven依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version></dependency>完整依赖如下&am…

栈和队列笔试题

答案&#xff1a;&#xff08;1&#xff09;seqn[tail]data; tail(tail1)%SEQLEN; &#xff08;2&#xff09;data seqn[head]; head (head1)%SEQLEN; &#xff08;3&#xff09;head tail; &#xff08;4&#xff09;(tail1)%SEQLEN head; (5) while(head!tail) head (h…

PHP WebSocket:技术解析与实用指南

本文旨在帮助初学者掌握在PHP中使用WebSocket的关键概念和技术。我们将深入讨论从建立连接、绑定到监听等各方面的操作&#xff0c;并提供易于理解和实践的指导。 一、socket协议的简介 WebSocket是什么&#xff0c;有什么优点 WebSocket是一个持久化的协议&#xff0c;这是…

基于相位的运动放大:如何检测和放大难以察觉的运动(01/2)

基于相位的运动放大&#xff1a;如何检测和放大难以察觉的运动 目录 一、说明二、结果的峰值三、金字塔背景3.1 可操纵金字塔3.2 亚倍频程复数可控金字塔 四、基本方针4.1 1D 问题陈述4.2 一维方法4.3 实际实施说明 五、放大倍率的限制5.1 空间支持的影响5.2 频带的影响 六、推…

【Oracle】玩转Oracle数据库(五):PL/SQL编程

前言 嗨&#xff0c;各位数据库达人&#xff01;准备好迎接数据库编程的新挑战了吗&#xff1f;今天我们要探索的是Oracle数据库中的神秘魔法——PL/SQL编程&#xff01;&#x1f52e;&#x1f4bb; 在这篇博文【Oracle】玩转Oracle数据库&#xff08;五&#xff09;&#xff1…

2.25基础会计学

资本公积是指由股东投入、但不能构成“股本”或“实收资本”的资金部分。 盈余公积是指公司按照规定从净利润中提取的各种积累资金。 所以区别在于盈余公积来自净利润。 借贷其实就是钱从哪来和到哪去的问题&#xff0c;来源是贷&#xff0c;流向是借。比如购入9w原材料&…

【监控】grafana图表使用快速上手

目录 1.前言 2.连接 3.图表 4.job和path 5.总结 1.前言 上一篇文章中&#xff0c;我们使用spring actuatorPrometheusgrafana实现了对一个spring boot应用的可视化监控。 【监控】Spring BootPrometheusGrafana实现可视化监控-CSDN博客 其中对grafana只是打开了一下&am…

YApi-pro docker安装在centos7上

之前安装失败了&#xff0c;只好在docker中装了。 准备环境 1.docker安装 centos7 docker 安装-CSDN博客 2.mongodb数据库docker安装 创建mongo容器目录 mkdir /data/mongo -p docker pull mongo:4.2.21 创建一个yapi网络插件 docker network create yapi …

音频声波的主观感受

一、响度 声压是“客观”的&#xff0c;响度是“主观”的。 响度又称音量。人耳感受到的声音强弱&#xff0c;它是人对声音大小的一个主观感觉量。响度的大小决定于声音接收处的波幅&#xff0c;就同一声源来说&#xff0c;波幅传播的愈远&#xff0c;响度愈小…

python jupyter notebook打开页面方便使用

如果没安装jupyter, 请安装&#xff1a; pip install jupyter notebook 运行jupyter notebook jupyter-notebook

【Redis】搞懂过期删除策略和内存淘汰策略

1、过期删除策略 1.1、介绍 Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存储到一个过期字典…

如何做到三天内完成智能直流伺服电机系统开发?

适应EtherCAT/CANopen协议三相伺服电机直流伺服电机直线伺服音圈电机 如何开发高性能直流伺服电机驱动控制器&#xff1f; 需要熟悉高性能单片机&#xff08;至少是ARM或DSP水平的&#xff09;&#xff0c;需要掌握空间磁场矢量控制FOC&#xff0c;需要掌握运动轨迹算法……此…

Vue监听器(上)之组合式watch

1. 定义监听器 //要监视的属性被改变时触发 watch(要监视的属性, (更改后的心值, 更改前的旧值) > {具体操作}, );//监视对象为getter的时候 //表达式内任意响应式属性被改变时触发 watch(() > return表达式, (表达式的新值, 表达式的旧值) > {具体操作} );//数组中任…