• Spring Boot 配置文件


    配置文件作用

    配置文件是保存整个项目中所有重要的数据的,比如:

    1. 数据库的连接信息
    2. 项目的启动端口
    3. 第三方系统的调用密钥等
    4. 用于发现和定位问题的普通日志和异常日志等

    如果没有配置文件,那么 Spring Boot 项目就不能连接和操作数据库,甚至是不能保存可以用于排查问题的关键日志。

    1. 配置文件的信息,一般都是 key-value 的形式。
    2. 配置文件可以设置为 开发环境 和 线上环境 两个部分,在开发的时候使用 开发环境,上线的时候使用 线上环境。
    3. 可以有多个配置文件,用来表示 开发,测试,线上 环境。

    配置文件的分类

    1. 系统级别的,如连接字符串,日志相关的设置,系统定义好的。
    2. 用户自定义的。

    配置文件的格式

    Spring Boot 的配置文件主要有两种格式“

    1. .properties
    2. .yml

    这两个的功能是一样的,但是,这两个是不同时代的产物,yml 是 properties 的升级版。

    配置文件一定是 application.xxx 也是约定大于配置的思想。不然就不起作用了。

    指定端口

    通过 server.port 来指定端口。.properties 如下:
    在这里插入图片描述
    运行结果如下:
    在这里插入图片描述
    就只能通过 9090 端口来访问了。

    .yml 文件配置:

    在这里插入图片描述
    运行结果如下:

    在这里插入图片描述

    规则

    1. 一个项目当中可以存在两种配置文件,但是不建议一个项目中出现两种配置文件。
    2. 当一个项目的某个配置,出现在两种格式的配置文件当中,那么配置项会以 properties 为主。

    properties

    配置文件的基本语法:key=value 之间没有空格。而且一个键值对之后也不能有空格。

    server.port=9090
    
    • 1

    server.port 就是系统配置,配置数据库连接:
    在这里插入图片描述

    缺点

    properties 中有很多冗余的信息,如:
    在这里插入图片描述
    所以改变的时候,就可以通过 yml 来完成改进。

    yml

    yml 是一个可读性高,语法简洁,易于理解的配置文件。并且可以简单表达一些元素的形态,基础语法是:key: value 空格不能省略,如果是多层目录的话,就一层层往下:
    在这里插入图片描述
    yml 支持更多的类型,如对象,数组等类型。yml 最大的优势是跨语言。

    连接数据库

    如图:
    在这里插入图片描述
    相比较 properties,yml 的数据冗余度就很低了。

    单双引号

    单双引号对 yml 中文件的内容引用之后,会有不同的效果:

    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1:3306/user?characterEncoding=utf8&useSSL=false
        name: root
        password: sjp151
    
    mystring: hello\nworld
    mystring2: 'hello\nworld'
    mystring3: "hello\nworld"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    运行结果如下:
    在这里插入图片描述
    只有最后一个换行了,不加 引号 和 单引号的都没换行,加了双引号的换行了。

    1. 不加引号 和 加 单引号相当于是加了 转义字符。
    2. 给 双引号 也加上转义字符 mystring3: "hello\\nworld" 运行结果如下:
      在这里插入图片描述
      就可以输出原字符串了。

    配置对象和取对象

    在 yml 中配置一个对象:

    student:
      id: 1
      name: zhangsan
      age: 18
    
    • 1
    • 2
    • 3
    • 4

    也可以使用行内写法:

    student: {id: 1,name: zhangsan,age: 18}
    
    • 1

    取对象,取对象的时候就不能用 @Value 来取了。要在对象里面添加一个注解 @ConfigurationProperties(prefix = “student”)

    创建对象并加注解:

    @Data
    @Component
    @ConfigurationProperties(prefix = "student")
    public class student {
        private int id;
        private String name;
        private int age;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    @Data 注解就包括了,Getter,Setter 等方法。

    通过 @Autowird 来注入类,然后来使用:

    @Controller
    public class UserController {
        @Autowired
        private Student student;
    
        @ResponseBody
        @RequestMapping("/sayhi")
        public String sayHi() {
            return "student: " + student;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果如下:
    在这里插入图片描述

    配置集合和获取

    类似于对象的写法:

    listname: #配置文件的名称
      name: #集合的名称
        - mysql #集合的值
        - sqlserver
        - oracle
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当然也能写成行内式:

    listname: {name: [mysql,sqlserver,oracle]}
    
    • 1

    集合读取的时候和对象读取差不多,也是通过 @ConfigurationProperties 来读取的:

    @Data
    @Component
    @ConfigurationProperties("listname")
    public class ListName {
        private List<String> name;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行代码:

    @Controller
    public class UserController {
    
        @Autowired
        private ListName listName;
    
        @ResponseBody
        @RequestMapping("/sayhi")
        public String sayHi() {
            return "listname: " + listName.getName();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果如下:
    在这里插入图片描述

    读取配置文件

    使用 @Value 注解就可以读取配置文件的某一个项了,但是读取的时候一定要加 $ 符号 和 大括号:

    @Controller
    public class UserController {
        
        @Value("${server.port}")
        private String port;
        @ResponseBody
        @RequestMapping("/sayhi")
        public String sayHi() {
            return "Hello World  port: " + port;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    运行结果如下:
    在这里插入图片描述
    也可以一次读取多个,那么就需要多个 @Value,我们在 yml 当中也写入参数:
    在这里插入图片描述
    然后引入:

    @Controller
    public class UserController {
    
        @Value("${server.port}")
        private String port;
        @Value("${myyml.string}")
        private String myyml;
        @ResponseBody
        @RequestMapping("/sayhi")
        public String sayHi() {
            return "Hello World  port: " + port + " myyml: " + myyml;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    【python基础】时间模块的time的下面的方法使用解析
    【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)
    接口测试实战 | Android 高版本无法抓取 HTTPS,怎么办?
    【OSPF Loading、FULL状态与display ospf peer brief命令、OSPF的数据库讲解】
    LeetCode-219. 存在重复元素 II.(java)
    二叉树最大宽度 : 简单 DFS 运用题
    华为存储s2600t配置上架
    在 Elasticsearch 中实现自动完成功能 2:n-gram
    泛型实例运用
    [交互]前端展示服务端获取的图片
  • 原文地址:https://blog.csdn.net/sjp151/article/details/126827991