10-Spring Boot配置文件

目录

1.配置文件作用

2.配置文件的格式

为配置文件安装提示插件

2.1. .properties(旧版,默认的)

2.1.1.基本语法

PS:配置文件中使用"#"来添加注释信息,2种添加方式:

2.1.2.缺点分析

2.2. .yml(新版)

2.2.1.基本语法

2.2.2.使用进阶

①配置不同数据类型及null

②配置对象

@ConfigurationProperties来读取配置中的对象:

③配置集合

集合的读取和对象一样,也是使用 @ConfigurationProperties 来读取的。

2.3.properties VS yml

2.4.查看更多系统配置项

3.读取配置文件

3.1.读取properties配置文件:

3.2.读取yml配置文件:

PS:注意:value值加单双引号(yml)

4.扩展:Spring Boot读取配置文件的5种方法

4.1.@Value注解(仅限单个信息,集合和对象除外)

4.2.@ConfigurationProperties注解

4.3.Environment(Spring提供的对象,注入后就能用)

4.4.@PropertySource注解

中文乱码

4.5.原生方式读取(不推荐麻烦)

5.设置不同平台的配置文件

5.1.创建不同平台的配置文件

5.2.在主配置文件中配置项目的运行平台


1.配置文件作用

整个项目中所有重要的数据(会随环境变更的配置信息)都是在配置文件中配置的,如:

  • 数据库的连接信息(包含用户名和密码的设置)。
  • 项目的启动端口。
  • 第三方系统的调用密钥等信息。
  • 用于发现定位问题的普通日志和异常日志等。

配置文件中存储的内容有2种:

①系统级别的信息;

②程序员自定义的信息(特殊业务如保存第三方密钥)。

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

如果没有配置文件,配置信息若写死在源代码中,会存在的问题:

  1. 配置项可能写在多个源代码的文件中,会有遗漏的风险。而配置文件让所有的配置信息都统一写在一起,无论查看还是修改都一目了然。

  2. 文件保存地址:本地(大概率是Windows系统)和生产服务器(99.9%为Linux系统)二者的目录就完全不一样。MySQL连接的配置文件,本地和远程是不一样的。

    Spring Boot一个项目里可以设置2套以上的环境,如:

    有一个配置文件专门写在开发环境,还为生产环境再去建一个配置文件。

    (这样就不用像之前:上线时配置文件要改为生产环境的配置文件,本地运行时又改为开发环境的配置文件)

    只需在进行环境变更的时候,指定一下Spring Boot要用哪个环境的配置文件就行。

    (两个文件不存在把哪个注释掉,不用像之前一样添加注释改来改去)

  3. 若把所有的配置信息写死在源代码中,是不可改的;而写在配置文件中,是可改的。

    .java源代码(可改)编译后生成的target文件夹里是.class字节码文件(改不了);

    而配置文件(可改)编译后生成的target文件夹里还是配置文件(可改)。

    项目最后运行格式是jar包的格式,jar包里放的是target里的文件,配置文件可以直接从jar包中拉出来,做完修改后再放回压缩包里覆盖原先内容,利于修改。

  4. 若是在源代码中写的内容,只能由程序员来进行修改;而配置文件中的内容不仅程序员可改,运维工程师(可改配置文件,懂Linux指令,攻防安全的手段,不会改java源代码)也可修改。在项目上线时,运维决定把服务放在哪台机器上,决定连哪个数据库,他就需要能直接去改配置文件。

2.配置文件的格式

Spring Boot配置文件主要分为以下2种格式(文件的后缀代表文件的格式,配置文件也是如此):

  • properties类型的配置文件属于老版本一代产品,也是创建Spring Boot项目时默认的文件格式;而yml属于新版二代产品,若程序员会用且要用,直接创建即可。
  • 配置文件的名称是固定的认死的,只能是"application",如果改成其它的名称,配置文件的内容将不再生效。(约定大于配置)
  • 配置文件里尽量不要出现中文,会有乱码。yml中可以用中文,因为创建时默认文件格式是UTF-8(支持简单和复杂中文);properties中千万不要用中文,第二次打开会出现中文变乱码情况,因为创建时文件格式默认是GBK(在未进行系统配置之前)。解决:File -> New Projects Settings -> Settings for New projects... -> 搜File Encodings -> 全改为UTF-8(3处) -> OK【已建好的项目改不回来,下一次新建项目才会起作用】
  • 理论上讲,项目中二者可以并存,当二者并存于一个项目中时,如果2个配置文件中出现了同样的配置,则会以properties中的配置为主,也就是.properties配置文件的优先级最高,但加载完.properties配置文件之后,也会加载.yml文件的配置信息。(约定大于配置
  • 实际业务中,不会混用,会采用一种统一的配置文件格式,这样可以更好地维护(降低故障率)。

为配置文件安装提示插件

IDEA社区版安装Spring Assistant插件之后,就可以正常创建Spring Boot项目了,并且支持yml配置文件的代码提示,但默认不支持properties配置文件的代码提示。(专业版当然天然支持)

此时需要安装Spring Tools插件并重启才会有相应提示。

部分版本IDEA可能没有,尝试使用在线安装地址:Spring Tools在线安装地址https://plugins.jetbrains.com/plugin/14279-spring-tools

也有可能与自己电脑上的IDEA适配不了。

若实在安装不了,就直接用yml吧~

2.1..properties(旧版,默认的)

2.1.1.基本语法

properties是以键值的形式配置的,key和value之间是以"="连接的。

注:"="的前后不需要加空格,末尾不需要加分号,空格。加多余的任何东西都会报错!

key1=value1
key2=value2
...

PS:配置文件中使用"#"来添加注释信息,2种添加方式:

①选中要添加注释的内容 ctrl + "/";

②在要添加注释的内容前面直接 + "#"。

①系统级别的信息

# 配置项⽬端⼝号
server.port=8084
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

②程序员自定义的信息(key可以为任意内容,只要不是中文就行)

myconfig.sayhi=hello,config.

2.1.2.缺点分析

配置key有很多冗余信息,也看不出层级关系。要解决此问题,需要用到yml配置文件的格式化。

2.2..yml(新版)

  • yml是YAML的缩写。(Yet Another Markup Language另一种标记语言)
  • yml是一个语法简单,可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言(json)类似,并且支持更多的数据类型,可以简单表达清单(数组),对象,散列表,标量等数据形态。不再使用value(只能读取单个的基本数据类型的值)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构,各种配置文件等。
  • yml最大的优势是可以跨语言,通用性高,不止是Java中可以使用,golong,高版本的python都可以使用yml作为配置文件。有利于大型企业不同地区(使用语言可能不同)团队合作时程序的互通互联。如果是云服务器开发,可以使用⼀份配置文件作为 Java 和 Go 的共同配置文件。

golong是非常火的谷歌的语言(谷歌目的是创建一种在性能上打败C++,但比C++好用很多的语言),以性能著称,今日头条用的多。

线程是轻量级的进程,Java里并发编程使用的都是多线程;

协程是轻量级的线程,它支持的某些特性是比Java还要灵活些的。golong里有协程,Java里没有。

2.2.1.基本语法

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

注:key和value之间使用英文冒号加空格的方式组成,其中的空格不可省略

简单的多级目录写法:

前面有一个tab表示一级目录,没有tab:一级目录;有1个tab:二级目录;有2个tab:三级目录。

key1:  #一级
  key2:  #二级
    key3: value2 #三级
    key4: value3 #三级

连接数据库配置:(解决了properties的冗余问题)

# 连接数据库配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8
    username: root
    password: 12345678
    driver-class-name: com.mysql.driver

2.2.2.使用进阶

①配置不同数据类型及null

# 字符串
string.value: Hello

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

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

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

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

②配置对象

多行写法:(一个标准对象表达式)

student: # 一级目录是对象的名称
  id: 1 # 二级目录是这个对象的所有属性
  name: Java # 二级目录是这个对象的所有属性
  age: 18 # 二级目录是这个对象的所有属性

行内写法:(更像json的数据格式)(与上面的写法作用一致) (数据比较多时推荐使用)

student: { id: 1,name: Java,age: 18 }

此时就不能用@Value(读取非对象,集合)来读取配置中的对象了,而要用另一个注解:

@ConfigurationProperties来读取配置中的对象

@ConfigurationProperties(prefix = "对象的名称") 

其中的 "prefix = " 可以省略。

多行写法和行内写法读取一样。

student: # 一级目录是对象
  id: 1 # 二级目录是这个对象的所有属性
  name: Java # 二级目录是这个对象的所有属性
  age: 18 # 二级目录是这个对象的所有属性
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data //因为加lombok,所以加上@Data注解就会有get,set方法
@ConfigurationProperties(prefix = "student") //设置key值
@Component //必须要加5大类注解
public class Student {
    private int id;
    private String name;
    private int age;
}
import com.example.demo.model.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Autowired //注入
    private Student student;

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        System.out.println(student);
        return "日志详见控制台";
    }
}

③配置集合

配置文件也可以配置list集合。

多行写法:

dbtypes:  # 集合的名称
  name:  # 属性
    - mysql # 属性的值
    - sqlserver # 属性的值
    - db2 # 属性的值

行内写法:(与上面的写法作用一致)(数据比较多时推荐使用)

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

集合的读取和对象一样,也是使 @ConfigurationProperties 来读取的。

@ConfigurationProperties("集合的名称")
dbtypes: { name: [ mysql,sqlserver,db2 ] }
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@Data
@ConfigurationProperties("dbtypes") //读取dbtypes集合赋值到DBTypes类里的name属性
public class DBTypes { 
    private List<String> name; //此处的属性名要和所读取的集合的属性名保持一致
}
import com.example.demo.model.DBTypes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Autowired
    private DBTypes dbTypes;

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        return "dbtypes:" + dbTypes;
    }
}

2.3.properties VS yml

  • properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂冒号加空格的⽅式设置,并且空格不可省略。
  • properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使用 yml 可以很好的解决数据冗余的问题。 

2.4.查看更多系统配置项

想要查看Spring Boot更多系统配置项,访问官网:Spring Boot更多系统配置项https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

3.读取配置文件

在项目中若要主动读取配置文件中的内容,可以使用@Value(仅限单个信息,集合和对象除外)注解来实现。

@Value注解使用"${}"的格式读取。

@Value("${server.port}")

无论是properties还是yml,中间都用"."连接其上下级。(它们的读取系统和自定义配置文件写法一样)

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
@RequestMapping("/hi") //路由映射
public class HelloController {
    @Value("${server.port}") //表示动态拿一个参数server.port
    private Integer port; //并把它赋值给port

    @RequestMapping("/index") //路由映射
    @ResponseBody //返回一个非静态页面的数据
    public String sayHi() {
        return "config:" + port;
    }
}

3.1.读取properties配置文件:

①读取系统配置信息:

②读取自定义配置信息:

3.2.读取yml配置文件:

PS:注意:value值加单双引号(yml)

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

在没有特殊字符时:啥都不加,加单引号,加双引号 -> 效果一样。

在有特殊字符时,如"\n":

# 字符串的定义方法
mystr1: 你好1\n你好1
mystr2: '你好2\n你好2'
mystr3: "你好3\n你好3"
mystr4: "你好4\\n你好4"
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component
public class ReadYml {
    @Value("${mystr1}")
    private String str1;

    @Value("${mystr2}")
    private String str2;

    @Value("${mystr3}")
    private String str3;

    @Value("${mystr4}")
    private String str4;

    @PostConstruct
    public void postConstruct() {
        System.out.println("mystr1:" + str1);
        System.out.println("mystr2:" + str2);
        System.out.println("mystr3:" + str3);
        System.out.println("mystr4:" + str4);
    }
}

@Component在Spring Boot启动时会注入到框架中,注入到框架中时会执行@PostConstruct初始化方法,此时就能读取到配置信息了。

  • 啥都不加:会将字符串中的特殊字符转义,比如将"\n"转换成"\\n"。
  • 加单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据。(和啥都不加情况一样)
  • 加双引号:不会转义字符串里的特殊字符,特殊字符会作为本身想表示的意思。"\n"就是换行;若是"\\n",才会将换行符转义为普通字符串。

:js/yml中单引号中可以是字符串;而java中单引号中是字符(char),双引号中才是字符串(string)。

4.扩展:Spring Boot读取配置文件的5种方法

4.1.@Value注解(仅限单个信息,集合和对象除外)

4.2.@ConfigurationProperties注解

4.3.Environment(Spring提供的对象,注入后就能用)

4.4.@PropertySource注解

中文乱码

如果配置文件中出现中文乱码的情况,可通过指定编码格式的方式来解决中文乱码问题。

@PropertySource(value = "dev.properties", encoding = "utf-8")
//value表示要读取的配置文件的名字
//encoding表示指定编码格式

注:@PropertySource注解默认是支持properties格式配置文件的读取的。

4.5.原生方式读取(不推荐麻烦)

前2种,可以解决读取配置配置文件的 90% 的问题。
其余三种,知道其存在即可。

5.设置不同平台的配置文件

5.1.创建不同平台的配置文件

开发环境,生产环境,测试环境......(一般至少2个:开发和生产)

要求:不同平台的配置文件格式必须符合规范:

application-环境名称.yml(properties)

必须是以application-开头,中间环境名称随意命名,后缀是.yml或.properties。

开发环境:application-dev.yml

生产环境:application-prod.yml

主配置文件:application.yml

5.2.在主配置文件中配置项目的运行平台

开始Idea只会在主配置文件中读取,不会读取其他环境的配置文件。

测试:

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值