SpringBoot 配置文件

文章目录

  • [一、SpringBoot 配置文件](#一、SpringBoot 配置文件)
    • [1.1 配置文件的使用演示:](#1.1 配置文件的使用演示:)
    • [1.2 配置文件的格式:](#1.2 配置文件的格式:)
  • [二、properties 配置文件说明](#二、properties 配置文件说明)
    • [2.1 properties 基本语法:](#2.1 properties 基本语法:)
    • [2.2 读取配置文件(@Value):](#2.2 读取配置文件(@Value):)
    • [2.3 properties 缺点分析:](#2.3 properties 缺点分析:)
  • [三、yml 配置文件说明](#三、yml 配置文件说明)
    • [3.1 yml 基本语法:](#3.1 yml 基本语法:)
    • [3.2 yml 配置不同数据类型以及null:](#3.2 yml 配置不同数据类型以及null:)
    • [3.3 yml 配置读取(@Value):](#3.3 yml 配置读取(@Value):)
    • [3.4 注意事项:value 值加单双引号:](#3.4 注意事项:value 值加单双引号:)
    • [3.5 读取配置对象(@ConfigurationProperties):](#3.5 读取配置对象(@ConfigurationProperties):)
    • [3.6 配置 List:](#3.6 配置 List:)
    • [3.7 配置 Map:](#3.7 配置 Map:)
    • [3.8 yml 优缺点:](#3.8 yml 优缺点:)
  • 四、总结

配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据,并加载运行。

一、SpringBoot 配置文件

SpringBoot 支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到 SpringBoot 的目的。

很多项目或者框架的配置信息也放在配置文件中,比如:

  • 项目的启动端口。

  • 数据库的连接信息(包含用户名和密码的设置)。

  • 第三方系统的调用密钥等信息。

  • 用于发现和定位问题的普通日志和异常日志等。

1.1 配置文件的使用演示:

Tocmat 默认端口号是 8080,所以我们程序访问时的端口号也是 8080,但是如果 8080 端口号已经被其他进程使用了呢?

我们可以通过配置文件来修改服务段的端口号。

SpringBoot 在创建项目时,就已经帮我们创建了配置文件。

修改application.properties文件。

properties 复制代码
server.port=9090

重新运行程序,观察日志。

显示 Tomcat 启动端口号为 9090。所以接下来访问程序接口要把路径改为:http://127.0.0.1:9090/...

原来的端口号 8080 就访问不了了。

1.2 配置文件的格式:

Spring Boot 配置文件有以下三种:

  • application.properties

  • application.yml

  • application.yaml

yml 为 yaml 的简写,实际开发中出现频率最高。yaml 和 yml 的使用方式一样,故本文只讲 yml 文件的使用。

当应用程序启动时,Spring Boot 会自动从 classpath 路径找到并加载 application.properties 和 application.yaml 或者 application.yml 文件。(配置文件名字只能取这三者的名字之一,如果不是,那么 Spring 会找不到配置文件)。

如果实在要使用别的配置文件名字,可以通过 spring.config.name 来进行指定,参考: https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config.files

注意:

  1. 理论上讲.properties.yml可以并存在于一个项目中,当.properties.yml 并存时,两个配置都会加载。如果配置文件内容有冲突,则以.properties为主,也就是.properties优先级更高。
  2. 虽然理论上来讲.properties可以和.yml共存,但实际的业务当中,我们通常会采取一种统一的配置文件格式,这样可以更好的维护(降低故障率)。

二、properties 配置文件说明

properties 配置文件是最早期的配置文件格式,也是创建 SpringBoot 项目默认的配置文件。

2.1 properties 基本语法:

properties 是以键值的形式配置的,key(单词之间使用.进行分割,字母小写) 和 value 之间是以"="连接的,如:

properties 复制代码
# 配置项⽬端⼝号 
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

配置文件中使用"#"来添加注释信息。

2.2 读取配置文件(@Value):

如果在项目中,想要主动的读取配置文件中的内容,可以使用 @Value 注解来实现。@Value 注解使用${}的格式读取({}里面放的是 key),如下代码所示:

配置文件:

properties 复制代码
myKey.key=gobeyye

代码:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

    @Value("${myKey.key}")
    private String key;

    @RequestMapping("/prop")
    public String getProp(){
        return "获取到的值: " + key;
    }
}

效果如下:

2.3 properties 缺点分析:

properties 配置是以 key-value 的形式配置的,如下图所示:

从上述配置 key 看出,properties 配置文件中会有很多的冗余的信息。

想要解决这个问题,就可以使用 yml 配置文件的格式化了。

三、yml 配置文件说明

yml 是 YAML 的缩写,它的全称 Yet Another Markup Language 翻译成中文就是:另一种标记语言。

3.1 yml 基本语法:

yml 是树形结构的配置文件,它的基础语法是key:空格value(因为空格不太明显,所以这里使用中文标识)。

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

第一项的配置为正确的,key 也是高亮显示的。第二项没有空格是错误的使用方式,第二项的 key 也没有高亮显示。

key 的单词与单词之间使用 :+\n(换行)

使用演示:

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

注意:缩进是不能乱写的,要注意层次。(采用每一分割,两个缩进,也有别的方式,不过这个我觉得比较好)。

如果是从外面复制代码的话,从最左边粘贴。

3.2 yml 配置不同数据类型以及null:

yaml 复制代码
# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null,~代表null
null.value: ~
# "" 空字符串
#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''

上面的写法是不对的,但是为了方便观看,所以没有将.转化成:+\n

3.3 yml 配置读取(@Value):

yml 读取配置的方式和 properties 相同,使用 @Value 注解即可,实现代码如下:

yml配置:

yaml 复制代码
string:
  key: gobeyye

代码:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

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

    @RequestMapping("/prop")
    public String getProp(){
        return "获取到的值:" + key;
    }
}

效果如下:

3.4 注意事项:value 值加单双引号:

字符串默认不用加上单引号或者双引号,如果加英文的单双引号可以表示特殊的含义。 尝试在 application.yml 中配置如下信息:

yaml 复制代码
string:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

代码:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

    @Value("${string.str1}")
    private String key1;
    @Value("${string.str2}")
    private String key2;
    @Value("${string.str3}")
    private String key3;

    @RequestMapping("/prop")
    public void getProp(){
        System.out.println(key1);
        System.out.println(key2);
        System.out.println(key3);
    }
}

效果如下:

从上述结果可以看出:

  • 字符串默认不用加上单引号或者双引号。

  • 单引号会转义特殊字符,使其失去特殊功能,始终是一个普通的字符串。

  • 双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义。

3.5 读取配置对象(@ConfigurationProperties):

我们还可以在 yml 中配置对象,如下配置:

yaml 复制代码
student:
  id: 1
  name: gobeyye
  age: 18

或者是使用行内写法(与上面的写法作用一致,了解即可,之后就不再演示了):

yaml 复制代码
student: {id: 1,name: gobeyye,age: 18}

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

java 复制代码
@Component
@Data
@ConfigurationProperties(prefix = "student")
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

调用类代码如下:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

    @Autowired
    private Student student;
    @RequestMapping("/prop")
    public void getProp(){
        System.out.println(student);
    }
}

访问 http://127.0.0.1:8080/controller/prop 效果如下:

3.6 配置 List:

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

yaml 复制代码
dbtypes:
  name:
    - mysql
    - sqlserver
    - db2

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

java 复制代码
@Component
@Data
@ConfigurationProperties(prefix = "dbtypes")
public class DB {
    List<String> name;
}

访问集合的实现如下:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

    @Autowired
    private DB db;
    @RequestMapping("/prop")
    public void getProp(){
        System.out.println(db);
    }
}

效果如下:

3.7 配置 Map:

配置文件也可以配置 map,如下所示:

yaml 复制代码
maptypes:
  val:
    k1: kk1
    k2: kk2
    k3: kk3

具体实现如下:

java 复制代码
@Component
@Data
@ConfigurationProperties("maptypes")
public class MyMap {
    Map<String,String> val;
}

调用类:

java 复制代码
@RestController
@RequestMapping("/controller")
public class PropertiesController {

    @Autowired
    private MyMap myMap;
    @RequestMapping("/prop")
    public void getProp(){
        System.out.println(myMap);
    }
}

效果如下:

3.8 yml 优缺点:

优点:

  1. 可读性高,写法简单,易于理解。

  2. 支持更多的数据类型,可以简单表达对象,数组,List,Map 等数据形态。

  3. 支持更多的编程语言,不止是 Java 中可以使用,在 Golang,Python,Ruby,JavaScript 中也可以使用。

缺点:

  1. 不适合写复杂且稀疏的配置文件。
  2. 对格式有较强的要求。

四、总结

  1. properties 是以 key=value 的形式配置的键值类型的配置文件,yml 使用的是树形配置方式。
  2. yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用":"(英文冒号)加空格的方式设置,并且空格不可省略。
  3. properties 为早期并且默认的配置文件格式,其配置存在一定的冗余数据,使用 yml 可以很好的解决数据冗余的问题,但不适合写复杂配置。
  4. yml 可以和 properties 共存,但一个项目中建议只使用一种配置类型文件。

结语:
其实写博客不仅仅是为了教大家,同时这也有利于我巩固知识点,和做一个学习的总结,由于作者水平有限,对文章有任何问题还请指出,非常感谢。如果大家有所收获的话,还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

相关推荐
装不满的克莱因瓶26 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗34 分钟前
常用类晨考day15
java
骇客野人37 分钟前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++
向宇it2 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
Lojarro2 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
莫名其妙小饼干2 小时前
网上球鞋竞拍系统|Java|SSM|VUE| 前后端分离
java·开发语言·maven·mssql
isolusion2 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil73 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
zjw_rp3 小时前
Spring-AOP
java·后端·spring·spring-aop