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
-
只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用到 @Configuration 注解来添加组件到容器中。
-
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获取整个配置文件 | 单个属性值 |
- 使用位置不同
-
@ConfigurationProperties:标注在 JavaBean 的类名上;
-
@Value:标注在 JavaBean 的属性上。
- 功能不同
-
@ConfigurationProperties:用于批量绑定配置文件中的配置;
-
@Value:只能一个一个的指定需要绑定的配置。
- 松散绑定支持不同
@ConfigurationProperties:支持松散绑定(松散语法),例如实体类 Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:
-
person.firstName
-
person.first-name
-
person.first_name
-
PERSON.FIRST_NAME
@Vaule:不支持松散绑定。
- SpEL 支持不同
-
@ConfigurationProperties:不支持 SpEL 表达式;
-
@Value:支持 SpEL 表达式。
- 复杂类型封装
-
@ConfigurationProperties:支持所有类型数据的封装,例如 Map、List、Set、以及对象等;
-
@Value:支持基本数据类型的封装,例如字符串、布尔值、整数等类型, 对集合Map list set配置有要求
6.属性校验
-
@Value不支持属性校验
-
@ConfigurationProperties 支持属性校验
- 应用场景不同
@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 配置,其实现方式如下:
-
使用 @Configuration 注解定义配置类,替换 Spring 的配置文件;
-
配置类内部可以包含有一个或多个被 @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 的默认配置文件。
-
file:./config/*/application.properties 高
-
file:./config/application.properties
-
file:./application.properties
-
classpath:/config/application.properties
-
classpath:/application.properties 低
注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。
以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。
所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:
-
存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
-
存在不同的配置内容时,高优先级和低优先级的配置内容取并集。