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文件。

复制代码
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 之间是以"="连接的,如:

复制代码
# 配置项?端?号 
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),如下代码所示:

配置文件:

复制代码
myKey.key=

代码:

复制代码
@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 的单词与单词之间使用 :+ (换行)

使用演示:

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

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

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

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

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

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

3.3 yml 配置读取(@Value):

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

yml配置:

复制代码
string:
  key: 

代码:

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

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

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

效果如下:

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

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

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

代码:

复制代码
@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 中配置对象,如下配置:

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

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

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

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

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

调用类代码如下:

复制代码
@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 集合,如下所示:

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

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

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

访问集合的实现如下:

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

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

效果如下:

3.7 配置 Map:

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

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

具体实现如下:

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

调用类:

复制代码
@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 共存,但一个项目中建议只使用一种配置类型文件。

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

相关推荐
一只叫煤球的猫7 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9658 小时前
tcp/ip 中的多路复用
后端
bobz9658 小时前
tls ingress 简单记录
后端
皮皮林5519 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友9 小时前
什么是OpenSSL
后端·安全·程序员
bobz9659 小时前
mcp 直接操作浏览器
后端
前端小张同学12 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook12 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康13 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在13 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net