Spring Boot 配置文件

引言

配置文件的作用

一个 Spring Boot 项目中所有重要的数据都是在配置文件中配置的,例如:

  • 数据库的连接信息,包含用户名和密码的设置
  • Spring Boot 项目的启动端口
  • 第三方系统的调用秘钥信息
  • 用于发现和定位问题的日志打印

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

一、Spring Boot 配置文件的格式

1. properties ( 老版本)

2. yml ( 新版本 )

注意

1. 理论上说,一个 Spring Boot 项目可以同时使用 " properties " 和 " yml " 配置文件,但不建议一个项目中出现两种配置文件,因为这就是一种规范。 试想,当一个公司在处理一个项目时,一批人用了前者,一批人用了后者,这就比较混乱,若不能实现代码的统一,就很可能出现差错。

2. 如果一个 Spring Boot 项目中真的同时使用了上述的两种配置文件,那么最终配置项就会以 " properies " 为主,从而忽略了 " yml ".

二、配置文件的分类

1.系统的配置文件。

比如数据库连接、日志的相关设置,这些都是框架已经提供好的固定写法。

2. 用户自定义的配置文件。

我们可以自己设置一些想要的配置,但一般很少。因为我们使用 Spring Boot 最多的无非就是 Web 开发,也就是做一个网页的后端,很多东西都是固定的,所以一般来说,使用系统配置好的即可。

三、properties 文件

当我们成功创建一个 Spring Boot 项目后,properties 文件就会自动生成在【resources】目录下。

1-1

1. properties 文件的配置语法

properties 的语法和 Map 键值对很类似。

它的注释是 " # ",就相当于 Java 中的 " // ".

例如,我通过 properties 文件,对数据库进行一些配置,重新设置端口号,并尝试与本地数据库建立连接。

# 系统配置文件
server.port=9090
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/database?characterEncoding=utf8&&useSSL=false
spring.datasource.name=root
spring.datasource.password=12345

# 自定义配置文件
string1=abc
string2=123

当我们配置好文件后,重新运行启动类,Tomcat 端口号就会直接被改变,那么,当我们使用浏览器发送 HTTP 请求的时候,就不再是 " 8080 " 了,而是当前的 " 9090 ".

1-2

2. 注意事项

(1) properties 文件的语法是键值对结构,即 " key=value “,在我们日常写入配置的时候,” = " 的左右不应该留有空格,如:" server.port = 9090 ",这样写是不规范的,因为,有空格就可能会出错,它并不像 Java 代码一样,编译器能够为我们审核。此外,9090 的后面也不应该加上空格。

(2) 实际上,properties 文件,在 IDEA 社区版,Java 并不会为我们实现语法补全,我们需要自己添加插件,但是本人试了好几个插件都没有解决问题,可能是因为自己 IDEA 版本有问题。小伙伴可以自己试一试类似于 " Spring Tools " 这种插件,如果最终解决了最好,如果解决不了也没关系,虽然没有语法补全,但是,常用的与 Web 开发相关的系统配置文件就那么多,多写几遍就能记住了。

(3) 如果 properties 文件的注释出现乱码了,需要通过 IDEA 将当前项目和新创建的项目的全部编码设置为 UTF-8.

3. 读取配置文件

我们创建一个 " UserController2 " 类,在里面写入如下代码:

@Controller
public class UserController2 {

    @Value("${server.port}")
    private String port;

    @ResponseBody
    @RequestMapping("/hello2")
    public String hello() {
        return "port = " + port;
    }
}

运行启动类,打开浏览器输入 URL:

1-3

对于上面的格式进行说明:

@Value("${server.port}")
private String port;

第一行代码 " @Value(${ }) " 这是一种固定写法,表示一次性读取单个的配置项。如果我们需要读多个配置项,那就多写几个这样的注解。

第二行代码,就是将刚刚的配置项赋予一个新的成员变量,类似于对象注入。

4. properties 文件的缺点分析

就拿与数据库进行连接操作时,使用的代码来看,代码较为冗余,当我们设置数据库地址、用户、密码的时候,都需要包含 " spring.datasource " 这个前缀,此外,社区版 IDEA 若没有代码补全功能的话,使用起来体验感还是很差的。

spring.datasource.url=
spring.datasource.name=
spring.datasource.password=

四、yml 文件

当我们成功创建一个 Spring Boot 项目后,yml 文件并不会自动生成,所以,我们应该自己创建一个 yml 文件,放在 【resources】目录下。

2-1

1. 注意事项

在上面创建 yml 文件的前后,有三个地方需要注意。

(1) 创建 yml 文件的统一名称为 " application.yml ",这是一种规范,Spring Boot 框架只认识这个特殊的名字,如果换成别的名字,就会出错。

(2) 创建好 yml 文件后,我们需要将 properties 文件下的代码都注释掉,以防最终框架忽略了 yml 的代码。

(3) 创建好 yml 文件后,社区版 IDEA 会为我们自动生成 [ 语法补全和语法高亮 ] 的功能,并不需要我们额外添加插件。

2. yml 文件的配置语法

yml 的语法,有效地解决了 properties 文件代码冗余的缺点,它的代码结构与树形结构很相似,共同的部分不需要重复写。

# 系统的配置文件
server:
  port: 8090

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/oj_database?characterEncoding=utf8&&useSSL=false
    name: root
    password: 12345

重新配置的 Tomcat 端口:

2-2

3. 语法需要注意的问题

它的基础语法是 " key: value ",由 key 和 value 之间的冒号加空格的方式组成的,其中的空格不可省略。

4. 读取单个配置项

" @Value " 注解读取普通数据

虽然 yml 文件中的配置语法是通过 " : " 的方式进行配置的,但当我们利用注解读取配置文件的时候,还是用 " . " 的方式读取到某个特定的配置项。

@Controller
public class UserController2 {

    @Value("${server.port}")
    private String port;

    @ResponseBody
    @RequestMapping("/hello2")
    public String hello() {
        return "port = " + port;
    }
}

运行启动类,打开浏览器输入 URL:

2-3

" @Value " 注解读取单双引号字符串

yml 配置文件:

# 自定义配置文件

string1: hello\nworld
string2: 'hello\nworld'
string3: "hello\nworld"

创建一个 " UserController3 " 类,利用 " @Value " 注解读取上面的三个自定义配置项,代码如下所示:

@Controller
public class UserController3 {

    @Value("${string1}")
    private String sting1;

    @Value("${string2}")
    private String sting2;

    @Value("${string3}")
    private String sting3;

    @ResponseBody
    @RequestMapping("/hello3")
    public String hello() {
        System.out.println(sting1);
        System.out.println(sting2);
        System.out.println(sting3);
        return sting1 + " | " + sting2 + " | " + sting3;
    }
}

IDEA 打印日志和抓包结果:

2-5

前端展示结果:

因为 HTML 的换行是 br 标签,所以在这里它并没有实质性的换行。

2-4

从上面的展示结果来看,我们可以得出结论:

1. yml 配置文件中的字符串,默认不用加上单引号或双引号。

2. 单引号会对字符串中的特殊字符进行转义。( 比如:" \n " -> " \\n " )

3. 双引号不会转义字符串里面的特殊字符,字符串仍旧表达原语义。

5. yml 文件的对象的配置和读取

yml 文件的对象配置写法有两种,代码如下:

# 配置对象 1
student1:
  id: 1
  name: 杰克
  age: 20

# 配置对象 2
student2: { id: 2, name: 露丝, age: 18 }

创建一个 Student 类,并对类进行注解," @Data " 注解是由 lombok 提供的,它包含了 " Getter、Setter、equals " 等众多方法,所以虽然我们在下面为字段设置了 private 限定符,但在外面的类,依然能够拿到对应值。代码如下:

@Data
@Component // 不能省略
@ConfigurationProperties(prefix = "student1") // 读取配置文件中的对象
public class Student {
    private int id;
    private String name;
    private int age;
}

创建一个 " UserController4 " 类,以属性注入的方式进行 Student 对象注入,并给前端返回一个字符串数据。代码如下:

@Controller
public class UserController4 {

    @Autowired
    private Student student;

    @ResponseBody
    @RequestMapping("hello4")
    public String hello() {
        return student.toString();
    }
}

展示结果:

2-5

上面的是读取配置文件中的 student1 对象,如果我们需要读取 student2 对象,只需对 Student 的下面注解进行修改即可。

@ConfigurationProperties(prefix = "student2")

6. yml 文件的集合的配置和读取

yml 文件的集合配置写法有两种,代码如下:

# 配置集合 1
gather1:
  language:
    - HTML
    - CSS
    - JS


# 配置集合 2
gather2: { language: [ C, C++, Java ] }

创建一个 ReadGather 类,并对类进行注解,细节部分我就不不展开说了,它和对象的配置项思路很相似。

@Data
@Controller
@ConfigurationProperties(prefix = "gather2")
public class ReadGather {
    private List<String> language;
}

创建一个 " UserController5 " 类,以属性注入的方式进行 ReadGather 对象注入,并给前端返回一个字符串数据。代码如下:

@Controller
public class UserController5 {

    @Autowired
    private ReadGather readGather;

    @ResponseBody
    @RequestMapping("/hello5")
    public String hello5() {
        return "gather: " + readGather.getLanguage();
    }
}

展示结果:

2-6

五、更多的官方配置项

Spring Boot 常用的系统配置项,随着我们学习的深入,多写几遍就能记住,如果万一我们记不住了,或想要查看系统更多的配置项,我们就可以访问官网:

https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties

六、对比 properties 和 yml

1. properties 是以 " key=value " 的形式配置文件, yml 使用的是类似 json 格式的树形配置方式进行配置的,yml 层级之间使用换行缩进的方式配置,key 和 value 之间使用冒号加空格的方式设置,并且空格不可省略。

2. properties 为早期默认的配置文件格式,但其配置存在一定的冗余数据,yml 算是 properties 的新版本,它可以很好地解决数据冗余的问题。此外,yml 写法更简单、可读性更高,并支持更多的数据类型。

3. yml 的通用性更好,支持更多语言,例如 Java、Go、Python 等。如果是云服务器开发,项目可以使用同一份配置文件作为多种语言的共同配置文件。这是 yml 的一个很大的特点,它有利于不同开发人员做的同一个项目。

4. yml 虽然可以和 properties 共存,但一个项目中建议只使用其中一种。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十七ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值