• Spring Boot配置文件相关


    目录

    1.配置文件的应用

    2.配置文件的格式

    3.properties 配置⽂件说明

    4.yml配置文件说明

    5.两种配置文件对比


    1.配置文件的应用

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

    数据库的连接信息(包含⽤户名和密码的设置);

    项⽬的启动端⼝; 第三⽅系统的调⽤秘钥等信息;

    ⽤于发现和定位问题的普通⽇志和异常⽇志等。

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

    比如我们Spring Boot启动的默认端口是8080,而有时这个端口被占用了,我们想更换一个端口,此时我们可以通过配置文件非常快捷地区修改。比如下面这样:

    我们就会发现我们的端口号就从8080变成了8081 

    这就是配置文件简单的应用之一,接下来我们会继续讲解配置文件相关用法 有关Spring Boot更多系统配置项请查看官网,在需要时我们直接查看即可,不需要背下来

    2.配置文件的格式 

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

    .properties

    .yml

    如下图所示:

     这两种配置文件其实在作用上别无二致,只不过是两个时代的产物罢了。.properties是比较老的一种格式,而.yml是比较新的一种格式。

    注意:

    1. 理论上讲 properties 可以和 yml ⼀起存在于⼀个项目当中,当 properties 和 yml ⼀起存在⼀个项⽬中时,如果配置⽂件中出现了同样的配置,⽐如 properties 和 yml 中都配置了“server.port”,那 么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最高,但加载完 .properties ⽂件之后,也会加载 .yml⽂件的配置信息。

    2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配 置⽂件格式,这样可以更好的维护(降低故障率)。

    3.配置文件必须是以application命名。这里体现了Spring Boot约定大于配置的思想(Spring Boot相比Spring需要配置的东西少了很多,因为更多的东西是通过约定而简化了)。类似的还有需要托管到Spring Boot的对象必须要放在Spring Boot启动类的根路径或者子路径下才能被框架识别。这里我们不需要像Spring一样去配置xml文件就是因为我们已经约定好了Spring Boot的扫描路径。

    为配置文件安装提示插件 

    IDEA 社区版安装 Spring Assistant 插件之后,就可以正常创建 Spring Boot 项⽬了,并且 yml 的配置 ⽂件就有提示了。但默认情况下是不⽀持 properties 格式的日志提示的,这个时候需要安装了 Spring Tools 插件才会有相应的提示。但是该插件目前仅支持2020及以前的版本,所以大家有能力的可以自行去安装IDEA教育版或者专业版,可以省去安装许多插件的烦恼。

    3.properties 配置文件说明

    3.1 解决properties中文乱码的问题

    大家初次配置properties文件时,如果输入了中文,在重启idea后可能就会发现中文消失或者变成了乱码。这是因为properties文件的编码格式默认并不是UTF-8,所以需要我们去手动更改。

    首先我们进入设置:

    接下来进入编辑器->文件编码设置下面将这三个选项全部改成UTF-8即可。

     然后还需要进入新项目设置再重复一次上述步骤。

     最后将原来的properties文件删除再重新创建即可(因为原来文件的编码格式已经无法更改,只能删除重建)。

    3.2 properties 基本语法

    properties 是以键值的形式配置的,key 和 value 之间是以“=”连接的,如:

    1. # 系统的配置文件
    2. server.port=8081
    3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8mb4&useSSL=true
    4. spring.datasource.name=root
    5. spring.datasource.password=123456
    6. # 自定义配置项
    7. bilibili.token=xxx
    8. mybilibili.token=xxx
    9. bilibili_token=xxx

    同时我们可以注意到除了系统的配置文件我们也可以自定义配置项,这个在我们使用一些软件的接口时会用到。

    3.3 读取配置文件

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

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

    1. @Controller
    2. public class UserController {
    3. @Value("${server.port}") // 读取配置项
    4. private String port;
    5. @ResponseBody // 返回一个非静态页面的数据
    6. @RequestMapping("/test") // 设置路由地址
    7. public String Test() {
    8. return "port:" + port;
    9. }
    10. }

    这样我们就可以在页面上来读取到我们的端口号信息了。

    3.4 properties 缺点分析 

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

     但是我们可以发现其实有很多信息是冗余的:

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

    4. yml配置文件说明

    yml 是 YMAL 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔”。 yml 是⼀个可读性⾼,易于理解,⽤来表达数据序列化的格式。它的语法和其他⾼级语⾔类似,并且可 以简单表达清单(数组)、散列表,标量等数据形态。

    4.1 yml的特点

    1.写法简单,可读性高

    2.支持更多数据类型(比如对象)

    3.跨语言使用(Java/Go/Python等)

    其中跨语言是yml最大的优势,他使得运维人员不需要同时维护多个不同语言的配置文件 。

    4.2 yml的语法

    yml 是树形结构的配置⽂件,它的基础语法是“key: value”,注意 key 和 value 之间使⽤英⽂冒号加空格的⽅式组成的,其中的空格不可省略

    这里似乎是因为专业版的原因所以会标红报错,社区版貌似并没有提示,大家请注意。

    使用 yml 连接数据库

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8
    4. username: root
    5. password: 123456

    可以看到yml因为采用了树形结构,相比properties它大大减少了代码冗余

    4.3 yml的使用

    4.3.1 yml 配置不同数据类型

    1. # 字符串
    2. string.value: Hello
    3. # 布尔值,truefalse
    4. boolean.value: true
    5. boolean.value1: false
    6. # 整数
    7. int.value: 10
    8. int.value1: 0b1010_0111_0100_1010_1110 # ⼆进制
    9. # 浮点数
    10. float.value: 3.14159
    11. float.value1: 314159e-5 # 科学计数法
    12. # Null,~代表null
    13. null.value: ~

    4.3.2 yml配置读取

    此处语法与properties读取配置完全一致,@Value 注解使⽤“${}”的格式读取,请参考前文的代码。这里不再重复说明。

    4.3.3 有关value值单双引号的注意事项

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

    我们看到下面的代码:

    1. string:
    2. str1: Hello\nWorld
    3. str2: 'Hello\nWorld'
    4. str3: "Hello\nWorld"

    我们将他读取出来并打印:

     从上述结果可以看出:

    1.字符串默认不⽤加上单引号或者双引号。

    2.单引号会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据

    3.双引号不会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思

    4.3.4 配置对象 

    不同于properties,在yml中是支持对象的。如下面配置。

    1. student:
    2. id: 1
    3. name: 张三
    4. age: 18

    也可以使用行内写法(与上面下用法一致,根据个人习惯选择即可)

    student: {id: 2,name: 李四,age: 20}

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

    1. @Data
    2. @ConfigurationProperties(prefix = "student")
    3. @Component
    4. public class StudentComponent {
    5. private int id;
    6. private String name;
    7. private int age;
    8. }

    注意此处我们使用了@Data注解。

    @Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。

    @Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

    如果不使用@Data注解的话我们还需要写出get和set以及tostring方法。

    调⽤类的实现如下:

    1. @Component
    2. public class ReadYml2 {
    3. @Autowired
    4. private StudentComponent studentComponent;
    5. @PostConstruct
    6. public void postConstruct() {
    7. System.out.println(studentComponent);
    8. }
    9. }

    @Component 在 Spring Boot 启动时候会注⼊到框架中,注⼊到框架中时会执⾏ @PostConstruct 初 始化⽅法,这个时候就能读取到配置信息了。


    该注解的方法在整个Bean初始化中的执行顺序:

    Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

    运行结果如下:

     4.3.5 配置集合

    1. dbtypes:
    2. name:
    3. - mysql
    4. - sqlserver
    5. - db2

    也可以使用行内写法

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

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

    1. @Component
    2. @ConfigurationProperties("dbtypes")
    3. @Data
    4. public class ListConfig {
    5. private List name;
    6. }

    打印类如下:

    1. @Component
    2. public class ReadYml {
    3. @Autowired
    4. private ListConfig listConfig;
    5. @PostConstruct
    6. public void postConstruct() {
    7. System.out.println(listConfig.getName());
    8. }
    9. }

     结果如下:

     5.properties 与 yml 对比总结

    1.roperties 是以 key=value 的形式配置的键值类型的配置⽂件,而 yml 使用的是类似 json 格式的 树形配置⽅式进⾏配置的,yml 层级之间使⽤换行缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。

    2.properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的 解决数据冗余的问题。

    3.yml 通用性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。

    4.yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件。

  • 相关阅读:
    Linux下JAVA使用JNA调用C++的动态链接库(g++或者gcc编译的.so文件)
    电子学会2021年6月青少年软件编程(图形化)等级考试试卷(三级)答案解析
    HAL库笔记(重要库函数)
    【Linux网络】典型NAS存储方式:NFS网络共享存储服务
    uniapp uview 头像裁剪组件的问题
    电磁逆设计中伴随变量法的详细指南:Python在Jupyter环境下的完整演示
    基于WT588F02A-16S语音芯片在启蒙玩具用品的方案设计应用解析
    URL、域名和网址的区别
    应用安全四十一:密码安全大全
    vue-前端实现模糊查询
  • 原文地址:https://blog.csdn.net/weixin_60778429/article/details/127561351