SpringBoot配置文件的加载顺序,以及多环境配置文件及控制器的设置。

1,931 阅读8分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

一、使用Spring Initializer快速创建Spring Boot项目

  上篇文章介绍了使用spring官网提供的Spring Initializr创建springboot基本项目,下面来介绍一下使用Idea的Spring Initializr创建spring boot项目。   随着互联网的发展,为了提供服务的高可用性,高扩展性,现在大部分项目都采用微服务的方式进行搭建,如创建一个父级项目,然后在父级项目下创建各个微服务模块,这样不仅可以避免重复引用一些依赖,也方便程序进行开发,下面就来进行搭建这样一个项目案例。

1-1、创建springboot parent项目

点击File->New->Project

image.png

选择Spring Initializr->配置项目信息->next image.png

选择当前spring boot的稳定版->finished

image.png

可能回报如下错误

image.png

解决方案:(如未遇到可跳过)

image.png

设置代理,并填写spring initializr地址 image.png

显示成功

image.png

再次按照上面的步骤进行创建项目即可

需要注意的是需要把父项目的pom中的packaging设置为pom

image.png

1-1-1、maven 打包方式

packaging中有三种打包方式:pom/jar/war

1-1-1-1、pom方式

用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom

聚合工程只是用来帮助其他模块构建的工具,本身并没有实质的内容。具体每个工程代码的编写还是在生成的工程中去写。
对于在父工程中导的依赖工程也可享有。

1-1-2、jar打包方式

****工程的默认打包方式,打包成jar用作jar包使用。存放一些其他工程都会使用的类,工具类。我们可以在其他工程的pom文件中去引用它

1-1-3、war打包方式

将会打包成war,发布在服务器上,如网站或服务。用户可以通过浏览器直接访问,或者是通过发布服务被别的工程调用

1-2、创建Module模块

在项目右键新建Module

image.png

填写项目相关信息

image.png

选择相关插件,先暂时只选择web

image.png 最终目录结构如下(刚刚创建的module在parent项目中)

image.png

1-2-1、修改继承关系

虽然刚刚在parent中创建了moudle但是查看moudle的pom.xml可以看到其parent还是springboot如下

image.png

1-2-2、修改moudle继承关系

将父项目pom中如下信息拷贝到moudle的parent中,这样就完成了moudle继承parent的关系。

<groupId>com.jony</groupId>
<artifactId>spring_initializr</artifactId>
<version>0.0.1-SNAPSHOT</version>

1650799607(1).jpg

1-3、项目结构介绍

image.png java 中编写我们相关java代码

resources文件夹中目录结构

  • static:保存所有的静态资源; js css images;

  • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf)

application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

1-4、创建一个Controller使用springboot

创建一个Controller,然后选择子项目的启动类,进行启动 image.png

1-4-1、测试

如下,这样就完成了一个简单的springboot项目使用 image.png

二、配置文件的使用

SpringBoot使用一个全局的配置文件 核心配置文件,配置文件名在约定的情况下名字是固定的;

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;文件名可以为以下格式

∙application.properties

∙application.yml

∙application.ymal

YAML(YAML Ain't Markup Language)

YAML A Markup Language:是一个标记语言

YAML isn't Markup Language:不是一个标记语言;

2-1、两种配置文件的格式

2-1-1、application.properties的用法:扁平的k/v格式。

#配置端口
server.port=8090
#配置项目虚拟路径
server.servlet.context-path=/jony

2-1-2、application.yml的用法:树型结构

server:
  port: 8090
  servlet:
    context-path: /jony

两种前者是,而后者是yml的,建议使用后者,因为它的可读性更强。 可以看到要转换成YML我们只需把properies里按.去拆分即可。

2-2、yml基本语法

1、k:(空格)v:表示一对键值对(空格必须有);

2、以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

3、属性和值也是大小写敏感;

4、如果有特殊字符% & 记得用单引号(‘)包起来

2-3、配置文件的加载顺序

 <includes>
     <include>**/application*.yml</include>
     <include>**/application*.yaml</include>
     <include>**/application*.properties</include>
 </includes>

如果同时存在不同后缀的文件配置信息会互补配置;

不同版本的springboot三个后缀文件的加载顺序也不太一样,我这边使用2.6.7,执行顺序如下:

image.png 实际测试中,发现如果yml和properties有相同配置,则按照properties,如下:

image.png

2-4、外部约定配置文件加载顺序:

springboot 启动还会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件。

由低到高顺序为:

  1. classpath根目录下的

image.png 2. classpath根config/

image.png 3. 项目根目录 如果当前项目是继承/耦合关系maven项目的话,项目根目录=父maven项目的根目录

image.png

  1. 项目根目录/config

image.png

  1. 直接子目录/config(在命令行中指定的文件)
java ‐jar spring‐0.0.1‐SNAPSHOT.jar ‐‐spring.config.location=D:\config/

优先级由底到高,高优先级的配置会覆盖低优先级的配置;互补配置;

需要注意的是,如果我们现在将子项目spring_initialrz进行打包,并且使用java -jar 运行jar包,最终使用的文件为子项目的resource/conf下的配置文件,因为在打包的时候parent项目是不进行打包的,最终打包里面的项目只有子项目中的相关代码配置信息。

2-5、Profile文件的加载

在实际项目开发过程中,我们的配置文件中有部分配置信息是不一致的,如:开发的时候使用测试数据库,发布线上的时候使用正式的数据库,我们可以在文件中进行直接修改,也可以通过Profile的方式进行处理。

SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。

2-5-1、多profile

1.Spring官方给出的语法规则是application-{profile}.properties(.yaml/.yml)。

2.如果需要创建自定义的的properties文件时,可以用application-xxx.properties的命名方式, 根据实际情况,我创建了一个开发环境下使用的properties文件和一个生产环境下使用的properties文件,其中只对端口进行了配置,如下图所示:

a)、开发环境

image.png

b)、生成环境

image.png

c)、若我们需要在两种环境下进行切换,只需要在application.yml中加入如下内容即可。。

image.png

先按照位置来读取优先级, 在同一位置下profile优先级最高, 如果没有指定profile, 先yml‐‐yaml‐‐properties

2-5-2、激活指定配置文件

2-5-2-1、在配置文件中指定 spring.profiles.active=dev

通过这种方式进行配置指定配置文件,如果同时有yam/yaml/properties是可以进行互补的。 指定使用dev环境 image.png

指定使用prod环境 image.png

2-5-2-1、通过命令行指定

2-5-2-1-1、指定jar包中的
java ‐jar spring_initializr‐0.0.1‐SNAPSHOT.jar ‐‐spring.profiles.active=dev;
2-5-2-1-2、spring.config.location

使用spring.config.location 指定的配置文件, 是不会进行互补。

java ‐jar configuration_file‐0.0.1‐SNAPSHOT.jar ‐‐spring.config.location=D:/application.properties
2-5-2-1-3、spring.config.name

使用spring.config.name 指定的配置文件, 是不会进行互补。

java ‐jar configuration_file‐0.0.1‐SNAPSHOT.jar ‐‐spring.config.name=application‐prod

2-5-3、多Profile设置Controller的读取

多Profile不仅可以设置读取配置文件,同样也可以设置使用的Controller.

image.png

2-5-3-1、测试

image.png

三、所有配置文件加载顺序

优先级从低到高

  1. 打包在jar中配置文件

  2. 打包在jar中profile

  3. 打包的jar之外的配置文件

  4. 打包的jar之外的profile

3-1、使用内置配置文件

java ‐jar spring_initializr‐0.0.1‐SNAPSHOT.jar

使用如上命令运行jar包则优先使用config中的配置文件,并且使用顺序为yml-->ymal-->properties

optional:classpath:/config/ yml‐‐>yaml‐‐>properties

optional:classpath:/ yml‐‐>yaml‐‐>properties

3-2、使用指定环境的配置文件

java ‐jar spring_initializr‐0.0.1‐SNAPSHOT.jar ‐‐spring.profiles.active=dev

通过以上命令就可以执行jar包中的开发环境配置文件

optional:classpath:/config/ profile‐dev ‐‐> yml‐‐>yaml‐‐>properties

optional:classpath:/ profile‐dev ‐‐> yml‐‐>yaml‐‐>properties

3-3、使用外部配置文件

java ‐jar spring_initializr‐0.0.1‐SNAPSHOT.jar ‐
‐spring.config.location=D:/application.properties

优先级最大, 因为指定了具体的配置文件。 所以不会和默认的约定配置文件进行互补

四、多配制文件的加载

实际项目中,可能会有很多配置文件,如数据库、redis、Netty、MQ等等,其实可以将这些配置文件都放到一个配置文件中,但是如果想将各个配置文件分开也可以的,springboot默认在扫描配置文件的时候,会扫描根目录config/*下的所有配置文件如:

config/redis/application.properties
config/mysql/aplication.prperties