SpringBoot 多元化配置(正则表达式,配置文件优先级)

1.配置绑定

所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。

SpringBoot 提供了以下 2 种方式进行配置绑定:

  • 使用 @Value 注解

  • 使用 @ConfigurationProperties 注解

解决中文乱码问题

@Value基础类型配置

当我们只需要读取配置文件中的某一个配置时,可以通过 @Value 注解获取。

语法:

@Value("${key}")
数据类型  成员变量;

@Value注解 

① ${ property : default_value }​

注入的是外部配置文件对应的property 

② #{ obj }​

1.是SpEL表达式

2.可以表示常量的值


#----------------key-value--------------------------

demo.name = 张三

#---------------数组与集合--------------------------

demo.myarray = 张三,李四,王五
demo.mylist  = 张三,李四,王五
demo.myset   = 张三,李四,王五

#--------------------Map----------------------

demo.mymap = {name: '张三', age: 22}

#--------------------日期----------------------demo.birthday1  = 2022/05/23demo.birthday2 = 2022-05-21demo.birthday3  = 2022-05-21 15:23:55


@Configurationpublic class MyConfig {
    @Value("${demo.name:李四}")    private String name;
    @Value("${demo.myarray}")    private String[] myarray;
    @Value("${demo.mylist}")    private List<Object> mylist;
    @Value("${demo.myset}")    private Set<Object> myset;
    @Value("#{${demo.mymap}}")    private Map<String,Object> mymap;
	@Value("#{100-3}")
    int num;
    @Value("${demo.birthday1}")    private Date birthday1;    3    @Value("${demo.birthday2}")    @DateTimeFormat(pattern = "yyyy-MM-dd")    private LocalDate birthday2;        @Value("${demo.birthday3}")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private LocalDateTime birthday3;

}

@ConfigurationProperties注解

通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将配置文件中的配置数据绑定到 JavaBean 中。


boy.name = 潘周聃
boy.age = 21
boy.birthday = 2020-10-09 14:23:15
boy.hobbyArray =  逛街2,看电影,吃饭
#boy.friendMap =  {name:'彭于晏',age:35} 不支持
boy.friendMap.name = 彭于晏
boy.friendMap.age = 35

boy.email = 12@qq.com
boy.password = z8niiea676
boy.price = 12.17
boy.phone = 13291132789
BOY.FIRST_NAME = 佩奇

package com.beiyou.config;




@Component
@ConfigurationProperties(prefix = "boy")
@Data
@Validated
public class Boy {

    private String name;

    private String firstName;

    @Pattern(regexp = "^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$", message = "必需为11位")
    private String phone;

    @Pattern(regexp = "^[0-9]+(\\.[0-9]{2})?$", message = "必需为两位小数")
    private String price;

    @NotNull
    @Size(min = 6,max = 10)
    @Pattern(regexp = "^[0-9A-Za-z]*$", message = "编号为数字和字母组合")
    private String password;

    @Min(20)
    private int age;

    @Email
    private String email;

    @Size(min=2, max=3)
    private String[] hobbyArray;

    @Past
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime birthday;

    private Map friendMap;

}


  1. 只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Configuration 注解来添加组件到容器中。

  2. JavaBean 上使用了注解 @ConfigurationProperties(prefix = "myadmin") ,它表示将这个 JavaBean 中的所有属性与配置文件中以“myadmin”为前缀的配置进行绑定。

@PropertySource

如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与 Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

我们也可以自定义配置文件,例如新建 user.properties ,配置内容如下:

pro.username=admin
pro.password=123456
pro.birthday=2000/12/01
pro.age=23
pro.books={jsp:36,html:360,spring:65}
pro.hobby=23,34
pro.list=sprig,myatis
pro.set=34,45,56

配置类:

@Component
@PropertySource("classpath:user.properties")
@Data
public class User {
    @Value("${pro.username}")
    String username;

    @Value("${pro.password}")
    String password;

    @Value("${pro.birthday}")
    Date birthday;

    @Value("${pro.age}")
    int age;

    @Value("#{${pro.books}}")
    Map books;

    @Value("${pro.hobby}")
    String [] hobby;

    @Value("${pro.list}")
    List list;

    @Value("${pro.set}")
    Set set;
}

注:该注解只能引用properties文件

配置属性校验证

自定义配置文件时,可以使用@Validated注解对注入的值进行一些简单的校验,示例代码

@Validated
@Configuration
@ConfigurationProperties(prefix = "person")
public class Person {
 @Email
 private String mail;

 public String getMail() {
 return mail;
 }

 public void setMail(String mail) {
 this.mail = mail;
 }
}

@Email 注解会对mail字段的注入值进行检验,如果注入的不是一个合法的邮件地址则会抛出异常。

其它常见注解:

  • @AssertFalse 校验false

  • @AssertTrue 校验true

  • @DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,是小于等于

  • @DecimalMin(value=,inclusive=) 与上类似

  • @Max(value=) 小于等于value

  • @Min(value=) 大于等于value

  • @Null 被注解的元索必须为空

  • @NotNull 被注解的元素必须不为空

  • @Past 检查日期

  • @Future 被注解的元素必须是一个将来的日期

  • @Pattern(regex=,flag=) 正则

  • @Size(min=, max=) 字符串,集合,map限制大小

  • @Validated 对po实体类进行校验

上述的这些注解位于javax.validation.constraints包下, SpringBoot 2.3.0以后maven引用:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

注: 属性校验只适用于批量注解

Pattern正则校验

在实体类的字段名上添加@Pattern注解,有个属性regexp,该属性的值就是正则表达式。

//数字和字母组合或空字符串 :
@Pattern(regexp = "^[0-9A-Za-z]*$", message = "编号为数字和字母组合")

^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ 表示匹配字符串的结束位置
* 表示匹配 零次到多次
+ 表示匹配 一次到多次 (至少有一次)
? 表示匹配零次或一次
. (圆点)表示匹配单个字符
| 表示为或者,两项中取一项(可用于两个正则之间)
( ) 小括号表示匹配括号中全部字符
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
\ 转义字符 如上基本符号匹配都需要转义字符 如 \*表示匹配*号
\w 表示英文字母和数字 \W 非字母和数字
\d 表示数字 \D 非数字
\s表示空字符串
当使用-时,需要放在最后一个位置,否则会被当成数字和字母之间区间的标识
 

//数字和字母组合 :
    @Pattern(regexp = "^[0-9A-Za-z]*$", message = "编号为数字和字母组合")
    @NotNull()
    private String classNo ;

正则表达式在线测试 | 菜鸟工具

正则表达式在线测试 | 菜鸟工具 (jyshare.com)

一、校验数字的表达式

  • 数字:^[0-9]*$

  • n位的数字:^\d{n}$

  • 至少n位的数字:^\d{n,}$

  • m-n位的数字:^\d{m,n}$

  • 零和非零开头的数字:^(0|[1-9][0-9]*)$

  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$

  • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$

  • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$

  • 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$

  • 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$

  • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

  • 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

  • 非负整数:^\d+$ 或 ^[1-9]\d*|0$

  • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

  • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

  • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

  • 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

  • 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

  • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二.校验字符的表达式

  • 汉字:^[\u4e00-\u9fa5]{0,}$

  • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

  • 长度为3-20的所有字符:^.{3,20}$

  • 由26个英文字母组成的字符串:^[A-Za-z]+$

  • 由26个大写英文字母组成的字符串:^[A-Z]+$

  • 由26个小写英文字母组成的字符串:^[a-z]+$

  • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$

  • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$

  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$

  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

  • 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+

  • 禁止输入含有~的字符:[^~]+

三、特殊需求表达式

  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?

  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

  • 手机号码:^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$

  • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)

  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$

  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$

  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}

  • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$

  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

  • 钱的输入格式:

  • 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$

  • 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$

  • 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$

  • 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$

  • 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$

  • 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$

  • 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

  • 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

  • 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里

  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

  • 中文字符的正则表达式:[\u4e00-\u9fa5]

  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)

  • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)

  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

  • IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}

总结:@Value 与 @ConfigurationProperties 对比

@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。

@ConfigurationProperties

@Value

位置不同

JavaBean类名上

JavaBean属性上

功能

批量属性注入

单值绑定

松散绑定(松散语法)

支持

部分支持

Spel

不支持

支持

复杂类型封装

支持

支持,比较繁琐

JSR303数据校验

支持

不支持

应用场景不同

通过JavaBean获取整个配置文件

单个属性值

1. 使用位置不同

  • @ConfigurationProperties:标注在 JavaBean 的类名上;

  • @Value:标注在 JavaBean 的属性上。

2. 功能不同

  • @ConfigurationProperties:用于批量绑定配置文件中的配置;

  • @Value:只能一个一个的指定需要绑定的配置。

3. 松散绑定支持不同

@ConfigurationProperties:支持松散绑定(松散语法),例如实体类 Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:

  • person.firstName

  • person.first-name

  • person.first_name

  • PERSON.FIRST_NAME

@Vaule:不支持松散绑定。

4. SpEL 支持不同

  • @ConfigurationProperties:不支持 SpEL 表达式;

  • @Value:支持 SpEL 表达式。

5. 复杂类型封装

  • @ConfigurationProperties:支持所有类型数据的封装,例如 Map、List、Set、以及对象等;

  • @Value:支持基本数据类型的封装,例如字符串、布尔值、整数等类型, 对集合Map list set配置有要求

6.属性校验

  • @Value不支持属性校验

  • @ConfigurationProperties 支持属性校验

7. 应用场景不同

@Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。

  • 若只是获取配置文件中的某项值,则推荐使用 @Value 注解;

  • 若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。

我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果。

2.导入传统xml配置

默认情况下,Spring Boot 中是不包含任何的 Spring 配置文件的,即使我们手动添加 Spring 配置文件到项目中,也不会被识别。

Spring Boot提倡基于Java的配置。尽管你可以使用XML源,不过还是建议你使用@Configuration类作为主要配置源。通常定义了main方法的类也是使用@Configuration注解的一个很好的替补。

使用 @ImportResource 注解加载 Spring 配置文件

1.@ImportResource 导入 Spring 配置文件

在主启动类上使用 @ImportResource 注解可以导入一个或多个 Spring 配置文件,并使其中的内容生效。

1、在resources下创建beans.xml文件,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

2、创建业务测试类

接口 OrderService

public interface OrderService {
    public void test();
}

实现类OrderServiceImpl

public class OrderServiceImpl  implements OrderService{

    @Override
    public void test() {
        System.out.println("xml配置获取类的实例");
    }
}

3、在beans.xml中增加配置

<bean id="orderService" class="com.by.OrderServiceImpl"/>

4、引入xml文件

@SpringBootApplication
@ImportResource(value = "classpath:beans.xml")

5、测试

​ 注入OrderService

2.@import导入其它配置类

您无需将所有内容都@Configuration放在一个类中。@Import注释可以用于导入额外的配置类。另外,您可以@ComponentScan用来自动拾取所有Spring组件,包括@Configuration类。

示例

1、更改配置类

package cn.test;

public class B {
    
    public void  test(){

        System.out.println("我是外包的类");

    }
}

2、测试引用

如果配置类跟主类在同一包及其子包下,无需引入,在不同包下通过@Import引入既可。

@SpringBootApplication
@Import({B.class})
public class DemoApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args);
        B bean = ctx.getBean(B.class);
        bean.test();
   }
}

3.@Configuration全注解方式加载 Spring 配置

Spring Boot 推荐我们使用全注解的方式加载 Spring 配置,其实现方式如下:

  1. 使用 @Configuration 注解定义配置类,替换 Spring 的配置文件;

  2. 配置类内部可以包含有一个或多个被 @Bean 注解的方法,这些方法会被 AnnotationConfigApplicationContext 或AnnotationConfigWebApplicationContext 类扫描,构建 bean 定义(相当于 Spring 配置文件中的<bean></bean>标签),方法的返回值会以组件的形式添加到容器中,组件的 id/name 就是方法名。

3.Profile(多环境配置)

在实际的项目开发中,一个项目通常会存在多个环境,例如,开发环境、测试环境和生产环境等。不同环境的配置也不尽相同,例如开发环境使用的是开发数据库,测试环境使用的是测试数据库,而生产环境使用的是线上的正式数据库。

Profile 为在不同环境下使用不同的配置提供了支持,我们可以通过激活、指定参数等方式快速切换环境。

3.1多 Profile 文件方式

Spring Boot 的配置文件共有两种形式:.properties 文件和 .yml 文件,不管哪种形式,它们都能通过文件名的命名形式区分出不同的环境的配置,文件命名格式为:

application-{profile}.properties/yml

XML

其中,{profile} 一般为各个环境的名称或简称,例如 dev、test 和 prod 等等。

properties 配置

在 src/main/resources 下添加 4 个配置文件:

  • application.properties:主配置文件

  • application-dev.properties:开发环境配置文件

  • application-test.properties:测试环境配置文件

  • application-prod.properties:生产环境配置文件

在 application.properties 文件中,指定默认服务器端口号为 8080,并通过以下配置激活生产环境(prod)的 profile。

#默认端口号
server.port=8080
#激活指定的profile
spring.profiles.active=prod

在 application-dev.properties 中,指定开发环境端口号为 8081,配置如下

# 开发环境
server.port=8081

在 application-test.properties 中,指定测试环境端口号为 8082,配置如下。

# 开发环境
server.port=8082

在 application-pro.properties 中,指定生产环境端口号为 8083,配置如下。

# 开发环境
server.port=8083

3.2 yml 配置

与 properties 文件类似,我们也可以添加 4 个配置文件:

  • application.yml:默认配置

  • application-dev.yml:开发环境配置

  • application-test.yml:测试环境配置

  • application-prod.yml:生产环境配置

在 applcation.yml 文件中指定默认服务端口号为 8080,并通过以下配置来激活开发环境的 profile。

#默认配置
server:
  port: 8080
#切换配置
spring:
  profiles:
    active: dev #激活开发环境配置

在 application-dev.yml 中指定开发环境端口号为 8081,配置如下。

#开发环境
server:  port: 8081

在 application-test.yml 中指定测试环境端口号为 8082,配置如下。

#测试环境
server:  port: 8082

在 application-pro.yml 中指定生产环境端口号为 8083,配置如下。

#生产环境
server:  port: 8083

3.3多 Profile 文档块模式

在 YAML 配置文件中,可以使用“---”把配置文件分割成了多个文档块,因此我们可以在不同的文档块中针对不同的环境进行不同的配置,并在第一个文档块内对配置进行切换。

#默认配置
server:
  port: 8080
#切换配置
spring:
  profiles:
    active: test
---
#开发环境
server:
  port: 8081
spring:
  config:
    activate:
      on-profile: dev
---
#测试环境
server:
  port: 8082
spring:
  config:
    activate:
      on-profile: test
---
#生产环境
server:
  port: 8083
spring:
  config:
    activate:
      on-profile: prod

3.4激活 Profile

除了可以在配置文件中激活指定 Profile,Spring Boot 还为我们提供了另外 2 种激活 Profile 的方式:

  • 命令行激活

  • 虚拟机参数激活

命令行激活

我们可以将 Spring Boot 项目打包成 JAR 文件,并在通过命令行运行时,配置命令行参数,激活指定的 Profile。

打开命令行窗口,跳转到 JAR 文件所在目录,执行以下命令,启动该项目,并激活开发环境(dev)的 Profile。

java -jar sbdemo-0.0.1-SNAPSHOT.jar  --spring.profiles.active=dev

Java

以上命令中,--spring.profiles.active=dev 为激活开发环境(dev)Profile 的命令行参数。

虚拟机参数激活

我们还可以在 Spring Boot 项目运行时,指定虚拟机参数来激活指定的 Profile。

4.默认配置文件优先级别

通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文件中对项目进行配置,但这并不意味着 Spring Boot 项目中只能存在一个 application.properties 或 application.yml。

Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。

Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。

  1. file:./config/*/ 高

  2. file:./config/

  3. file:./

  4. classpath:/config/

  5. classpath:/ 低

注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。

以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。

所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:

  • 存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;

  • 存在不同的配置内容时,高优先级和低优先级的配置内容取并集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

这孩子叫逆

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

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

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

打赏作者

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

抵扣说明:

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

余额充值