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。

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

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

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

相关推荐
欧恩意1 小时前
【Tools】Java反汇编工具推荐
java·汇编
苍何1 小时前
字节发力,豆包大模型2.0 震撼来袭(附 Trae 实测)
后端
苍何1 小时前
不会剪辑的人,开始用 AI 批量出爆款了
后端
苍何1 小时前
百度 APP 正式接入 OpenClaw,所有人限时免费!
后端
寻星探路2 小时前
【JVM 终极通关指南】万字长文从底层到实战全维度深度拆解 Java 虚拟机
java·开发语言·jvm·人工智能·python·算法·ai
lbb 小魔仙2 小时前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
星河耀银海2 小时前
Java安全开发实战:从代码防护到架构安全
java·安全·架构
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市水资源管理与节水策略制定中的应用
java·java 大数据·java 大数据可视化·城市水资源管理·spark 数据清洗·echarts 热力图·管网漏损控制
紫陌涵光2 小时前
112. 路径总和
java·前端·算法
workflower2 小时前
多变量时间序列预测
java·hadoop·nosql·需求分析·big data·结对编程