写点什么

[SpringBoot 系列] 基础过渡与夯实 (基础配置)

作者:fake smile by
  • 2022 年 9 月 13 日
    黑龙江
  • 本文字数:5740 字

    阅读完需:约 19 分钟

SpringBoot 基础配置

通过入门案例,各位小伙伴能够感知到一个信息,SpringBoot 没有具体的功能,它是辅助加快 Spring 程序的开发效率的。我们发现,现在几乎不用做任何配置功能就有了,确实很好用。但是仔细想想,没有做配置意味着什么?意味着配置已经做好了,不用你自己写了。但是新的问题又来了,如果不想用已经写好的默认配置,该如何干预呢?这就是这一章咱们要研究的问题。


​ 如果想修改默认的配置,这个信息应该写在什么位置呢?目前我们接触的入门案例中一共有 3 个文件,第一是 pom.xml 文件,设置项目的依赖,这个没什么好研究的,相关的高级内容咱们到原理篇再说,第二是引导类,这个是执行 SpringBoot 程序的入口,也不像是做功能配置的地方,其实还有一个信息,就是在 resources 目录下面有一个空白的文件,叫做 application.properties。一看就是个配置文件,咱们这一章就来说说配置文件怎么写,能写什么,怎么覆盖 SpringBoot 的默认配置修改成自己的配置。

属性配置

SpringBoot 通过配置文件 application.properties 就可以修改默认的配置,那咱们就先找个简单的配置下手,当前访问 tomcat 的默认端口是 8080,好熟悉的味道,但是不便于书写,我们先改成 80,通过这个操作来熟悉一下 SpringBoot 的配置格式是什么样的。



​ 那该如何写呢?properties 格式的文件书写规范是 key=value


name=nefu
复制代码


​ 这个格式肯定是不能颠覆的,那就尝试性的写就行了,改端口,写 port。当你输入 port 后,神奇的事情就发生了,这玩意儿带提示,太好了。



​ 根据提示敲回车,输入 80 端口,搞定。


server.port=80
复制代码


​ 下面就可以直接运行程序,测试效果了。


​ 我们惊奇的发现 SpringBoot 这玩意儿狠啊,以前修改端口在哪里改?tomcat 服务器的配置文件中改,现在呢?SpringBoot 专用的配置文件中改,是不是意味着以后所有的配置都可以写在这一个文件中呢?是的,简化开发者配置的书写位置,==集中管理==。妙啊,妈妈再也不用担心我找不到配置文件了。


​ 其实到这里我们应该得到如下三个信息:


  1. ==SpringBoot 程序可以在 application.properties 文件中进行属性配置==

  2. application.properties 文件中只要输入要配置的属性关键字就可以根据提示进行设置

  3. ==SpringBoot 将配置信息集中在一个文件中写,不管你是服务器的配置,还是数据库的配置,总之都写在一起,逃离一个项目十几种配置文件格式的尴尬局面==


总结


  1. SpringBoot 默认配置文件是 application.properties


接下来我们继续看几个配置:


​ 做完了端口的配置,趁热打铁,再做几个配置,目前项目启动时会显示一些日志信息,就来改一改这里面的一些设置。


关闭运行日志图表(banner)


spring.main.banner-mode=off
复制代码


设置运行日志的显示级别


logging.level.root=debug
复制代码


​ 你会发现,现在这么搞配置太爽了,以前你做配置怎么做?不同的技术有自己专用的配置文件,文件不同格式也不统一,现在呢?不用东奔西走的找配置文件写配置了,统一格式了,这就是大秦帝国啊,统一六国。SpringBoot 比大秦狠,因为未来出现的技术还没出现呢,但是现在已经确认了,配置都写这个文件里面。


​ 我们现在配置了 3 个信息,但是又有新的问题了。这个配置是随便写的吗?什么都能配?有没有一个东西显示所有能配置的项呢?此外这个配置和什么东西有关呢?会不会因为我写了什么东西以后才可以写什么配置呢?比如我现在没有写数据库相关的东西,能否配置数据呢?一个一个来,先说第一个问题,都能配置什么。


​ 打开 SpringBoot 的官网,找到 SpringBoot 官方文档,打开查看附录中的 Application Properties 就可以获取到对应的配置项了


网址奉上:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties


​ 能写什么的问题解决了,再来说第二个问题,这个配置项和什么有关。在 pom 中注释掉导入的 spring-boot-starter-web,然后刷新工程,你会发现配置的提示消失了。闹了半天是设定使用了什么技术才能做什么配置。也合理,不然没有使用对应技术,配了也是白配。


<font color="#f0f"><b>温馨提示</b></font>


​ 所有的 starter 中都会依赖下面这个 starter,叫做 spring-boot-starter。这个 starter 是所有的 SpringBoot 的 starter 的基础依赖,里面定义了 SpringBoot 相关的基础配置,关于这个 starter 我们到开发应用篇和原理篇中再深入讲解。


<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter</artifactId>    <version>2.5.4</version>    <scope>compile</scope></dependency>
复制代码


总结


  1. ==SpringBoot 中导入对应 starter 后,提供对应配置属性==

  2. ==书写 SpringBoot 配置采用关键字+提示形式书写==

配置文件分类

现在已经能够进行 SpringBoot 相关的配置了,但是 properties 格式的配置写起来总是觉得看着不舒服,所以就期望存在一种书写起来更简便的配置格式提供给开发者使用。有吗?还真有,SpringBoot 除了支持 properties 格式的配置文件,还支持另外两种格式的配置文件。三种配置文件格式分别如下:


  • properties 格式

  • yml 格式

  • yaml 格式


​ 一看到全新的文件格式,各位小伙伴肯定想,这下又要学习新的语法格式了。怎么说呢?从知识角度来说,要学,从开发角度来说,不用学。为什么呢?因为 SpringBoot 的配置在 Idea 工具下有提示啊,跟着提示走就行了。下面列举三种不同文件格式配置相同的属性范例,先了解一下。


  • application.properties(properties 格式)


server.port=80
复制代码


  • application.yml(yml 格式)


server:  port: 81
复制代码


  • application.yaml(yaml 格式)


server:  port: 82
复制代码


​ 仔细看会发现 yml 格式和 yaml 格式除了文件名后缀不一样,格式完全一样,是这样的,yml 和 yaml 文件格式就是一模一样的,只是文件后缀不同,所以可以合并成一种格式来看。那对于这三种格式来说,以后用哪一种比较多呢?记清楚,以后基本上都是用 yml 格式的,以后在企业开发过程中用这个格式的机会也最多,一定要重点掌握。


总结


  1. SpringBoot 提供了 3 种配置文件的格式

  2. properties(传统格式/默认格式)

  3. yml(主流格式)

  4. yaml

配置文件优先级

万一我三个都写了,他们三个谁说了算呢?打一架吗?


其实三个文件如果共存的话,谁生效说的就是配置文件加载的优先级别。先说一点,虽然以后这种情况很少出现,但是这个知识还是可以学习一下的。我们就让三个配置文件书写同样的信息,比如都配置端口,然后我们让每个文件配置的端口号都不一样,最后启动程序后看启动端口是多少就知道谁的加载优先级比较高了。


==这里我们直接给出结论:==


application.properties  >  application.yml  >  application.yaml
复制代码


不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留


最后想说你不用去死记硬背,首先这个情况不常发生,再者就算发生了我们可以根据实际情况修改尝试。

yaml 文件

SpringBoot 的配置以后主要使用 yml 结尾的这种文件格式,并且在书写时可以通过提示的形式加载正确的格式。但是这种文件还是有严格的书写格式要求的。下面就来说一下具体的语法格式。


YAML(YAML Ain't Markup Language),一种数据序列化格式。具有容易阅读、容易与脚本语言交互、以数据为核心,重数据轻格式的特点。常见的文件扩展名有两种:


  • .yml 格式(主流)

  • .yaml 格式


具体的语法格式要求如下:


  1. 大小写敏感

  2. 属性层级关系使用多行描述,每行结尾使用冒号结束

  3. 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用 Tab 键)

  4. 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  5. #号 表示注释


​ 上述规则不要死记硬背,按照书写习惯慢慢适应,并且在 Idea 下由于具有提示功能,慢慢适应着写格式就行了。核心的一条规则要记住,<font color="#ff0000"><b>数据前面要加空格与冒号隔开</b></font>。


​ 下面列出常见的数据书写格式,熟悉一下


boolean: TRUE              #TRUE,true,True,FALSE,false,False均可float: 3.14                #6.8523015e+5  #支持科学计数法int: 123                   #0b1010_0111_0100_1010_1110    #支持二进制、八进制、十六进制null: ~                    #使用~表示nullstring: HelloWorld            #字符串可以直接书写string2: "Hello World"        #可以使用双引号包裹特殊字符date: 2018-02-17              #日期必须使用yyyy-MM-dd格式datetime: 2018-02-17T15:02:31+08:00  #时间和日期之间使用T连接,最后使用+代表时区
复制代码


​ 此外,yaml 格式中也可以表示数组,在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,==减号与数据间空格分隔==。


subject:  - Java  - 前端  - 大数据enterprise:  name: itcast    age: 16    subject:      - Java        - 前端        - 大数据likes: [王者荣耀,刺激战场]      #数组书写缩略格式users:               #对象数组格式一  - name: Tom     age: 4  - name: Jerry    age: 5users:               #对象数组格式二  -      name: Tom    age: 4  -       name: Jerry    age: 5          users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]  #对象数组缩略格式
复制代码


总结


  1. yaml 语法规则

  2. 大小写敏感

  3. 属性层级关系使用多行描述,每行结尾使用冒号结束

  4. 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用 Tab 键)

  5. 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  6. #号 表示注释

  7. 注意属性名冒号后面与数据之间有一个空格

  8. 字面值、对象数据格式、数组数据格式

yaml 数据读取

对于 yaml 文件中的数据,其实你就可以想象成这就是一个小型的数据库,里面保存有若干数据,每个数据都有一个独立的名字,如果你想读取里面的数据,肯定是支持的,下面就介绍 3 种读取数据的方式。

读取单一数据

​ yaml 中保存的单个数据,可以使用 Spring 中的注解 @Value 读取单个数据.


属性名引用方式:<font color="#ff0000"><b>${一级属性名.二级属性名……}</b></font>



​ 记得使用 @Value 注解时,要将该注解写在某一个指定的 Spring 管控的 bean 的属性名上方,这样当 bean 进行初始化时候就可以读取到对应的单一数据了。


总结


  1. 使用 @Value 配合 SpEL 读取单个数据

  2. 如果数据存在多层级,依次书写层级名称即可

读取全部数据

​ 读取单一数据可以解决读取数据的问题,但是如果定义的数据量过大,这么一个一个书写肯定会累死人的,SpringBoot 提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做 Environment,使用自动装配注解可以将所有的 yaml 数据封装到这个对象中



​ 数据封装到了 Environment 对象中,获取属性时,通过 Environment 的接口操作进行,具体方法是 getProperties(String),参数填写属性名即可


总结


  1. 使用 Environment 对象封装全部配置信息

  2. 使用 @Autowired 自动装配数据到 Environment 对象中

读取对象数据

​ 单一数据读取书写比较繁琐,全数据读取封装的太厉害了,每次拿数据还要一个一个的 getProperties(),总之用起来都不是很舒服。由于 Java 是一个面向对象的语言,很多情况下,我们会将一组数据封装成一个对象。SpringBoot 也提供了可以将一组 yaml 对象数据封装一个 Java 对象的操作


​ 首先定义一个对象,并将该对象纳入 Spring 管控的范围,也就是定义成一个 bean,然后使用注解 @ConfigurationProperties 指定该对象加载哪一组 yaml 中配置的信息。



​ 这个 @ConfigurationProperties 必须告诉他加载的数据前缀是什么,这样指定前缀下的所有属性就封装到这个对象中。记得数据属性名要与对象的变量名一一对应啊,不然没法封装。其实以后如果你要定义一组数据自己使用,就可以先写一个对象,然后定义好属性,下面到配置中根据这个格式书写即可。



总结


  1. 使用 @ConfigurationProperties 注解绑定配置信息到封装类中

  2. 封装类需要定义为 Spring 管理的 bean,否则无法进行属性注入

yaml 文件中的数据引用

​ 如果你在书写 yaml 数据时,经常出现如下现象,比如很多个文件都具有相同的目录前缀


center:  dataDir: /usr/local/fire/data    tmpDir: /usr/local/fire/tmp    logDir: /usr/local/fire/log    msgDir: /usr/local/fire/msgDir
复制代码


​ 或者


center:  dataDir: D:/usr/local/fire/data    tmpDir: D:/usr/local/fire/tmp    logDir: D:/usr/local/fire/log    msgDir: D:/usr/local/fire/msgDir
复制代码


​ 这个时候你可以使用引用格式来定义数据,其实就是搞了个变量名,然后引用变量了,格式如下:


baseDir: /usr/local/firecenter:    dataDir: ${baseDir}/data    tmpDir: ${baseDir}/tmp    logDir: ${baseDir}/log    msgDir: ${baseDir}/msgDir
复制代码


​ 还有一个注意事项,在书写字符串时,如果需要使用转义字符,需要将数据字符串使用双引号包裹起来


lesson: "Spring\tboot\nlesson"
复制代码


总结


  1. 在配置文件中可以使用 ${属性名}方式引用属性值

  2. 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析

拓:自动提示功能消失解决方案

在做程序的过程中,可能有些小伙伴会基于各种各样的原因导致配置文件中没有提示,这个确实很让人头疼,所以下面给大家说一下如果自动提示功能消失了怎么解决。


​ 先要明确一个核心,就是自动提示功能不是 SpringBoot 技术给我们提供的,是我们在 Idea 工具下编程,这个编程工具给我们提供的。明白了这一点后,再来说为什么会出现这种现象。其实这个自动提示功能消失的原因还是蛮多的,如果想解决这个问题,就要知道为什么会消失,大体原因有如下 2 种:


  1. Idea 认为你现在写配置的文件不是个配置文件,所以拒绝给你提供提示功能

  2. Idea 认定你是合理的配置文件,但是 Idea 加载不到对应的提示信息

  3. 这里我们主要解决第一个现象.第一种现象的解决方式如下:


步骤①:打开设置,【Files】→【Project Structure...】



步骤②:在弹出窗口中左侧选择【Facets】,右侧选中 Spring 路径下对应的模块名称,也就是你自动提示功能消失的那个模块



步骤③:点击 Customize Spring Boot 按钮,此时可以看到当前模块对应的配置文件是哪些了。如果没有你想要称为配置文件的文件格式,就有可能无法弹出提示




步骤④:选择添加配置文件,然后选中要作为配置文件的具体文件就 OK 了



​ 到这里就做完了,其实就是 Idea 的一个小功能



总结


  1. 指定 SpringBoot 配置文件

  2. Setting → Project Structure → Facets

  3. 选中对应项目/工程

  4. Customize Spring Boot

  5. 选择配置文件

发布于: 刚刚阅读数: 4
用户头像

fake smile by

关注

还未添加个人签名 2022.07.31 加入

还未添加个人简介

评论

发布
暂无评论
[SpringBoot系列]基础过渡与夯实(基础配置)_Java_fake smile by_InfoQ写作社区