SpringBoot 多元化配置(处理乱码)

1.配置绑定

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

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

  • 使用 @Value 注解

  • 使用 @ConfigurationProperties 注解

解决中文乱码问题

@Value基础类型配置

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

语法:

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

GraphQL

@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

HTML

@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;        @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;

}

Java

@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 = 佩奇


Lua

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;

}




Java

  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=adminpro.password=123456pro.birthday=2000/12/01pro.age=23pro.books={jsp:36,html:360,spring:65}pro.hobby=23,34pro.list=sprig,myatispro.set=34,45,56

Plain Text

配置类:

@Component@PropertySource("classpath:user.properties")@Datapublic 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;}

Java

注:该注解只能引用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; }}

Java

@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>

XML

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

Pattern正则校验

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

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

Plain Text

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


Plain Text

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

Plain Text

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

一、校验数字的表达式 数字:^[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+(\.\..

https://c.runoob.com/front-end/854/

一、校验数字的表达式

  • 数字:^[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 的属性上。

  1. 功能不同
  • @ConfigurationProperties:用于批量绑定配置文件中的配置;

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

  1. 松散绑定支持不同

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

  • person.firstName

  • person.first-name

  • person.first_name

  • PERSON.FIRST_NAME

@Vaule:不支持松散绑定。

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

  • @Value:支持 SpEL 表达式。

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

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

6.属性校验

  • @Value不支持属性校验

  • @ConfigurationProperties 支持属性校验

  1. 应用场景不同

@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>

XML

2、创建业务测试类

接口 OrderService

public interface OrderService {    public void test();}

Java

实现类OrderServiceImpl

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

Java

3、在beans.xml中增加配置

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

XML

4、引入xml文件

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

Java

5、测试

​ 注入OrderService

2.@import导入其它配置类

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

示例

1、更改配置类


package cn.test;

public class B {
    
    public void  test(){

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

    }
}

Java

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();
   }
}

Java

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#激活指定的profilespring.profiles.active=prod

Plain Text

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

# 开发环境server.port=8081

Plain Text

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

# 开发环境server.port=8082

Plain Text

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

# 开发环境server.port=8083

Plain Text

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 #激活开发环境配置

YAML

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

#开发环境server:  port: 8081

YAML

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

#测试环境server:  port: 8082

YAML

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

#生产环境server:  port: 8083

Plain Text

3.3多 Profile 文档块模式

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

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

YAML

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/*/application.properties 高

  2. file:./config/application.properties

  3. file:./application.properties

  4. classpath:/config/application.properties

  5. classpath:/application.properties 低

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

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

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

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

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

相关推荐
齐 飞几秒前
MongoDB笔记03-MongoDB索引
前端·数据库·笔记·后端·mongodb
奔波儿灞爱霸波尔奔5 分钟前
杂七杂八之Swagger环境搭建(Java版本)
java·开发语言
_OLi_6 分钟前
IDEA中新建与切换Git分支
java·spring boot·git
hxj..12 分钟前
【设计模式】观察者模式
java·观察者模式·设计模式
tian-ming13 分钟前
(八)JavaWeb后端开发——Tomcat
java·spring boot·spring
蔚然成风shang18 分钟前
apache poi 实现下拉框联动校验
java
细心的莽夫29 分钟前
JavaWeb学习笔记
java·开发语言·笔记·学习·java-ee·web
郑小憨35 分钟前
Node.js简介以及安装部署 (基础介绍 一)
java·javascript·node.js
weixin_5375904543 分钟前
《Spring Boot从入门到实战》第四章习题
java·spring boot·后端
iteye_1039243 分钟前
腾讯cos对象存储,下行流量费贵,是否可以加入服务器减少费用,架构如何设计
java