【SpringBoot】SpringBoot 配置⽂件

配置文件作用

整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:

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

想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的❗

配置文件的分类

  1. 系统的配置文件,比如连接字符串,日志的相关设置,系统定义好的
  2. 用户自定义的

配置文件的格式

Spring Boot 配置⽂件主要分为以下两种格式:

  • .properties
  • .yml

规则

  1. 一个项目中可以存下两种配置文件(properies 和 yml),但是不建议一个项目中出现两种配置文件😅
  2. 当一个项目的某个配置,出现在两种格式的配置文件中时,那么 配置项会以 properies 为主(忽略 yml 中配置)

为配置⽂件安装提示插件

IDEA 社区版安装 Spring Assistant 插件之后,就可以正常创建 Spring Boot 项⽬了,并且 yml 的配置
⽂件就有提示了。但默认情况下是不⽀持 properties 格式的⽇志提示的,这个时候需要安装了 Spring
Tools 插件才会有相应的提示。
在这里插入图片描述

安装完以后记得重新启动idea😊

properties 配置文件说明

properties 配置⽂件是最早期的配置⽂件格式,也是创建 Spring Boot 项⽬默认的配置⽂件

properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:
在这里插入图片描述
注意:

  1. 配置文件注释用 “#”
  2. 如果出现中文乱码,全设置为utf8:
    在这里插入图片描述
    在这里插入图片描述
  3. 修改了还是中文乱码,需要将原来的 application.properties 删除掉,重新再创一个 application.properties。 因为之前的配置文件已经是不支持中文编码的文件格式化,设置编码再创建 application.properties 之后,所以以后设置的编码不会改变原来的旧的 application.properties 文件,所以需要先将原来的配置先删了在重新创建

读取单个配置文件

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。

@Value 注解使⽤“${}”的格式读取,如下代码所示:

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @Value("${server.port}")// 读取配置项
    private String port;

    @ResponseBody   //返回一个非静态页面的数据
    @RequestMapping("/sayhi")//设置路由地址,要小写
    public String sayHi(){
        return "hello world! | port:"+port;
    }
}

使用properties 配置文件执行结果:

在这里插入图片描述
使用yml配置文件执行结果:
在这里插入图片描述

properties 缺点分析

properties 配置是以 key-value 的形式配置的,如下图所示:
在这里插入图片描述
从上述配置key看出,properties 配置⽂件中会有很多的冗余的信息,⽐如这些:
在这里插入图片描述
想要解决这个问题,就可以使⽤ yml 配置⽂件的格式化了❗

yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语言”。

yml 特点

  • 写法简单,可读性高
  • 支持更多的数据类型
  • 跨语言使用:java/golang/高版本 python

yml 语法

yml 是树形结构的配置文件, 它的基础语法是 key: value,注意: key 和 value 之间使⽤英⽂冒号加空格的⽅式组成的,其中的空格不可省略。 省略会报错
在这里插入图片描述

yml 使用进阶

yml 配置不同数据类型及 null

# 字符串
string.value: Hello

# 布尔值,truefalse
boolean.value: true
boolean.value1: false


# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制

# 浮点数
float.value: 3.1111
float.value1: 314159e-5 # 科学计数法

# Null,~ 代表null
null.value: ~

在这里插入图片描述

yml配置读取

yml 读取配置的方式和 properties 相同,使⽤ @Value 注解即可,实现代码如下:
在这里插入图片描述
yml 单,双引号的问题:

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

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

mystring: 富强\n民主
mystring2: '文明\n和谐'
mystring3: "诚信\n友善"

读取程序实现代码如下:

package com.example.demo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    
    @Value("${mystring}")
    private String mystring;

    @Value("${mystring2}")
    private String mystring2;

    @Value("${mystring3}")
    private String mystring3;

    @ResponseBody   //返回一个非静态页面的数据
    @RequestMapping("/sayhi")//设置路由地址,要小写
    public String sayHi(){
        System.out.println("mystring:"+mystring);
        System.out.println("mystring2:"+mystring2);
        System.out.println("mystring3:"+mystring3);
        

    }
}

以上程序的执⾏结果如下图所示:
在这里插入图片描述

结论: yml 中如果使用了双引号就会按照(原)语义执行,如果不加单、双引号,或者加了单引号,那么默认会将字符串中的特殊字符进行转义,比如 \n ->\n(转义)处理

配置对象读取

yml配置:

# 对象写法1
student:
  id: 1
  name: 爱国
  age: 18

# 对象写法2
student2: { id: 2,name: 敬业,age: 20}

这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解@ConfigurationProperties
来读取,具体实现如下:

package com.example.demo.model;

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

@Data// lombok 生成getter、setter、toString等方法
@ConfigurationProperties(prefix = "student")// 读取配置文件中的对象
@Component// 不能省略
public class Student {
    private int id;
    private String name;
    private int age;
}

调⽤类的实现如下:

package com.example.demo;

import com.example.demo.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @Value("${myyml.string}")// 读取配置项
    private String port;

    @Value("${mystring}")
    private String mystring;

    @Value("${mystring2}")
    private String mystring2;

    @Value("${mystring3}")
    private String mystring3;

    @Autowired
    private Student student;

    @ResponseBody   //返回一个非静态页面的数据
    @RequestMapping("/sayhi")//设置路由地址,要小写
    public String sayHi(){
        System.out.println("mystring:"+mystring);
        System.out.println("mystring2:"+mystring2);
        System.out.println("mystring3:"+mystring3);
        System.out.println(student);
        return "hello world! | port:"+port;

    }
}

在这里插入图片描述
结果图如下:
在这里插入图片描述
若想得到第二个对象的内容:
在这里插入图片描述
在这里插入图片描述

配置集合

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

dbtypes:
 name:
   - mysql
   - sqlserver
   - db2

或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):

dbtypes: { name: [ mysql,sqlserver,db2 ] }

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

package com.example.demo.model;

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

import java.util.List;
@Component
@Data
@ConfigurationProperties(prefix = "dbtypes")//读取配置文件中集合
public class ReadList {
    private List<String>name;
}

打印类的实现如下:

package com.example.demo;

import com.example.demo.model.ReadList;
import com.example.demo.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Controller
public class UserController {
    @Value("${myyml.string}")// 读取配置项
    private String port;

    @Value("${mystring}")
    private String mystring;

    @Value("${mystring2}")
    private String mystring2;

    @Value("${mystring3}")
    private String mystring3;

    @Autowired
    private Student student;

    @Resource
    private ReadList readList;

    @ResponseBody   //返回一个非静态页面的数据
    @RequestMapping("/sayhi")//设置路由地址,要小写
    public String sayHi(){
        System.out.println("mystring:"+mystring);
        System.out.println("mystring2:"+mystring2);
        System.out.println("mystring3:"+mystring3);
        System.out.println(student);
        //return "hello world! | port:"+port;
        return  "readList:"+readList.getName();
    }
}

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

properties VS yml 总结

  1. properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂冒号加空格的⽅式设置,并且空格不可省略。
  2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的解决数据冗余的问题。
  3. yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份配置⽂件作为 Java 和 Go 的共同配置⽂件。
  4. yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值