springboot(二).springboot的配置文件

上篇文章我们一起新建了一个springboot项目,那么如果我们的8080端口被占用了呢,该如何修改内嵌servlet服务器tomcat的端口呢?其实很简单只要在配置文件中做一下简单配置就行了。

首先我们新建一个springboot的web项目,名称是demo1,当然也可以在我们上篇文章创建的springboot项目的基础上继续做,这个我们选择的工具是IDEA,接下来进入正题。

一.application.properties

1.配置

.properties格式文件语法比较简单,大项.小项 的形式。例如:我们要把tomcat的端口改成8081,在application.properties中可以这样配置,如下图:

springboot(二).springboot的配置文件_第1张图片

2.测试

接下来启动项目,查看控制台的日志如下图,说明此时服务的端口已经改变成8081了。

springboot(二).springboot的配置文件_第2张图片

二.application.yml

1.yml语法

(1).基本语法

k: v

表示一对键值对(k冒号和v之间有一个空格) 以空格的缩进来控制层级关系;

只要是左对齐的一列数据都是同一层级的。

如下图,下面的配置中port和path是同一层级的,属性和值也是大小写敏感的;

(2).值的写法

a.字面量

普通的值(数字、字符串、布尔);

k: v:字面量直接来写;

字符串默认不用加上单引号和双引号;

“”:双引号;转义字符会起作用,例如:

name: “zhangsan \n lisi”  输出:zhangsan 换行 lisi   

’:单引号;转义字符不会起作用,例如:

name: ‘zhangsan \n lisi’ 输出:zhangsan \n lisi

b.对象、Map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系,对象还是k: v的方式。例如:

还有一种行内写法,如下图:

c.数组(List、Set)

- value表示数组中的一个元素,如下图:

它也有行内写法,如下图:

2.配置

在项目的application.yml文件中,做如下配置(前提先把刚才在application.properties文件中配置注释掉):

springboot(二).springboot的配置文件_第3张图片

3.测试

接下来启动项目,查看控制台的日志如下图,说明此时服务的端口已经改变成8082了。

springboot(二).springboot的配置文件_第4张图片

补充:那么问题来了如果application.properties文件中配置的服务器端口为8081,application.yml文件配置的是8082,那么以哪个为准呢?答案是以application.properties文件的配置为准,该文件的优先级比较高。

三.profile

1.多profile文件

我们在主配置文件编写的时候,文件名可以是:application-{profile}.properties/yml;

我们可以创建多个这样的配置文件,如下:

              当前配置:application.properties,配置端口为8081

                    

              开发环境:application-dev.properties,配置端口号为8082:

                    

              生产环境:application-pord.properties,配置端口号为80

                    

默认使用application.properties文件的配置,现在启动项目后,端口号为8081。

       

如果我们想要开发环境的配置application-dev.properties生效,在默认配置文件application.properties文件中做如下配置:

          

现在再重新启动该项目,可以看到端口号为8082了。

           

2.yml支持多文档格式

.yml配置文件中用三个段横线把整个配置分成一个一个的文档。

我们在application.yml文件中如下配置。这时候我们的光标放在下图位置,下面显示document 2/3,可见的确是第二个文档。

springboot(二).springboot的配置文件_第5张图片

这时候我们启动项目,查看端口号,可见此时默认生效的是第一个document的配置,

             

那如果,我们要其他文档配置的端口号生效呢

       例如:我们要开发环境dev配置的端口号生效,添加下图红框中的配置

              springboot(二).springboot的配置文件_第6张图片

现在来启动项目,查看端口号为8083,可见dev的端口配置生效了。

             

3.激活指定的profile

在配置文件中指定要激活的配置文件(有多个配置文件,格式如:application-{profile}.properties),如下图(每个配置文件配置的端口号如红色箭头所指):

springboot(二).springboot的配置文件_第7张图片

(1).方式一:spring.profiles.active=dev

例如激活开发环境配置文件application-dev.properties

(2).方式二:命令行

例如要生产环境端口号配置生效,用 –spring.profiles.active=prod。

步骤:

a.点击Edit Configuration

  springboot(二).springboot的配置文件_第8张图片

b.在弹出页面进行如下配置,让application-prod.properties配置文件生效,点击OK

springboot(二).springboot的配置文件_第9张图片

c.重新启动项目,可以看到端口号是8084,说明生产环境prod的配置生效了。

(3).方式三:命令行启动jar包

a.把我们的项目先打包,如下图:

springboot(二).springboot的配置文件_第10张图片

b.右键target目录,点击show in Explorer

springboot(二).springboot的配置文件_第11张图片

c.点进target文件夹,找到我们刚才打的包

springboot(二).springboot的配置文件_第12张图片

d.在路径栏输入cmd,回车,进入dos窗口。

输入:java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod ,再回车启动jar包。(--spring.profiles.active前面是两个短杠)

springboot(二).springboot的配置文件_第13张图片

e.可以看到,端口号为8084,说明我们这种命令行启动方式使生产环境配置生效了。

springboot(二).springboot的配置文件_第14张图片

(4).方式四:虚拟机参数

例如要开发环境端口号配置生效,用 –Dspring.profiles.active=dev

步骤:

a.点击Edit Configuration

springboot(二).springboot的配置文件_第15张图片

b.在弹出页面进行如下配置,再点击OK(这里配置的是 VM options的参数和方式二命令行配置的Program arguments不同).

springboot(二).springboot的配置文件_第16张图片

c.重新启动项目,可以看到端口号是8084,说明生产环境prod的配置生效了。

springboot(二).springboot的配置文件_第17张图片

(5).补充:激活多个配置文件

一次激活多个配置文件,没有冲突的配置都生效,有冲突的配置,后面的配置生效。

我有两个yml文件,分别为:application-test.yml、application-cdd.yml,让这两个配置文件都生效,这样执行:

java -jar xxx.jar --spring.profiles.active="test,cdd"

使用示例:

java -jar xxx.jar 
# 指定外部配置文件
--spring.config.location=C:\Users\CHENGdd\Desktop\test\application-test.yml
# 指定激活test环境配置文件
--spring.pfofiles.active=test 
# 指定自定义的配置项
--time-task.distributed.deploymentCount=2
--time-task.distributed.currentNo=1 
# 指定端口
--server.port=9090
## 指定多个配置文件(外部文件跟jar包放同样的目录,内部的话放resource下)
--spring.profiles.active="test,cdd"

四.配置文件加载位置和顺序

1.配置文件加载位置

(1).默认配置文件加载位置

springboot启动会扫描以下位置的application.prpperties或者application.yml文件作文springboot的默认配置文件。注:file是项目根目录,classpath(类路径)resources目录下

——file:/config/  

——file:./

——classpath:/config/

——classpath:/

以上是按照优先级从高到低的顺序,所以位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容。

我们也可以通过配置spring.config.location来改变默认配置。

springboot会从这四个位置全部加载主配置文件:互补配置

互补配置:如果高优先级配置文件和低优先级配置文件都配置了某个属性,那么以高优先级的为准,如果低优先级配置文件配置了某个属性,而高优先级的没有配置,则低优先级配置文件的这个属性会生效。

注意:项目打包时,file:/config/ 和file:./下的配置文件不会被打进去。

(2). 改变默认的配置文件位置

我们还可以通过spring.config.location来改变默认的配置文件位置。

场景:项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。

指定配置文件和默认加载的这些配置文件都会生效形成互补配置。

a.首先我们在E:\springboot1目录下复制一份application.properties文件,并把其里面的端口号改为8085,如下图:

       springboot(二).springboot的配置文件_第18张图片

b.点进target文件夹,找到我们刚才打的包

springboot(二).springboot的配置文件_第19张图片

c.在路径栏输入cmd,回车,进入dos窗口。

输入命令: java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.location=E:/springboot1/application.properties

d.查看日志,端口号为8085,说明指定到E盘的这个配置文件生效了

springboot(二).springboot的配置文件_第20张图片

2.外部配置加载顺序

springboot可以从很多位置加载配置,官方文档中介绍了17个,springBoot外部配置官方文档 实际上我们常用的有下面这11个,优先级从高到低,高优先级会覆盖低优先级的配置,所有的配置会形成互补配置,如下:

(1).命令行参数

              例:java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=9001

              多个配置用--隔开,配置项=值

              例:jar -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=9002 --server.context-path=/abc

 (2).来自java:comp/env的NDI属性

 (3).Java系统属性(System.getProperties())

 (4).操作系统环境变量

 (5).RandomValuePropertySource配置的random.*属性

//优先加载带 profile 的,再来加载不带 profile 的,从jar包外向jar内寻找

(6).jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

(7).jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

(8).jar包外部的application.properties或application.yml(不带spring.profile)配置文件

(9).jar包内部的application.properties或application.yml(不带spring.profile)配置文件

(10).@Configuration注解类上的@PropertySource

(11).通过SpringApplication.setDefaultProperties指定的默认配置属性

所有支持的配置加载来源,可以参考我们的官方文档

到这里springboot项目配置文件部分就说到这里了,最近老熬夜,得赶紧睡觉了,有什么问题欢迎指出,欢迎随时交流沟通!

你可能感兴趣的:(#,Spring,Boot,spring系,application.yml,springboot配置文件,yml文件,激活指定profile)