目录
比较@Value和@ConfifigurationProperties获取值
Spring Boot的配置文件
- Spring Boot 使用一个全局配置文件,放置在src/main/resources目录或类路径的/config下;当然放在不同位置的优先级是不一样的。后面会学习。
- 配置文件的作用:修改 Spring Boot 自动配置的默认值;
- yml 是 YAML(YAML Ain't Markup Language)不是一个标记语言;
- 标记语言:以前的配置文件;大多都使用的是xxxxx.xml文件。
<server>
<port>8081</port>
</server>
- YAML:以数据为中心,配置数据的时候具有面向对象的特征;比 json、xml 等更适合做配置文件;可以理解为类:属性
server:
port:8081
YAML语法格式
YAML基本语法
- key: value 表示一对键值对(冒号后面必须要有空格)
- 使用空格缩进表示层级关系
- 左侧缩进的空格数目不重要,只要同一层级的元素左侧对齐即可
- key 与 value 大小写敏感
YMAL常用写法
字面量: 数值,字符串,布尔,日期
字符串 默认不用加上引号;
- 使用 双引号 不会转义特殊字符,特殊字符最终会转成本来想表示含义输出
- name: "hello \n world" 输出: hello 换行 world
- 使用 单引号 会转义特殊字符,特殊字符当作一个普通的字符串输出
- name: 'hello \n world' 输出:hello \n world
对象 & Map
分行写法:key: value value存储对象,每个值换一行写,注意值要左对齐
emp:
name: xiaoming
age: 22
salary: 5000
行内写法:
emp: {name: xiaoming, age: 22, salary: 5000}
推荐分行写法,清晰易读。
数组(List、Set)
用 - 值表示数组中的一个元素,例如
fortes:
- java
- python
- hadoop
行内写法
fortes: [java,python,hadoop]
yaml 配置文件注入值
我们写如下的pojo
@Component
@ConfigurationProperties(prefix = "emp")
public class Emp {
private String name;
private Integer age;
private Double salary;
private Boolean boss;
private Date birthday;
private Map map;
private List list;
getter and setter ………………
}
1、@ConfifigurationProperties 告诉SpringBoot将配置文件中对应属性的值,映射到这个组件类中,进行一一绑定
prefifix = "emp":配置文件中的前缀名,哪个前缀与下面的所有属性进行一一映射
2、@Component 必须将当前组件作为SpringBoot中的一个组件,才能使用容器提供的 @ConfifigurationProperties功能;
配置文件:
server:
port: 8081
servlet:
context-path: /yamlTest
emp:
name: zhangsan
age: 22
salary: 8000
boss: true
birthday: 1991/10/10
map:
key1: value1
key2: value2
list:
- one
- two
- three
测试类:
@SpringBootTest
class DemoApplicationTests {
@Autowired
Emp emp;
@Test
void contextLoads() {
System.out.println(emp);
}
}
注意:如果提示没有发现配置文件处理器,则加入以下依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
properties 配置文件注入值
我们将application.yml文件内容注释掉,编写application.properties
#配置emp的值
emp.name=李四
emp.age=30
emp.birthday=1989/9/12
emp.boss=false
emp.salary=9000
emp.map.key1=value1
emp.map.key2=value2
emp.list=one, two, three
乱码解决:
结果:
比较@Value和@ConfifigurationProperties获取值
使用@Value获取值,先把类中的@ConfifigurationProperties注释掉。
@Component
//@ConfigurationProperties(prefix = "emp")
public class Emp {
@Value("${emp.name}")
private String name;
@Value("#{121*2}")
private Integer age;
@Value("1000")
private Double salary;
private Boolean boss;
private Date birthday;
………………
总结 @Value 与 @ConfifigurationProperties 获取值的差异
@ConfifigurationProperties
| @Value | 样例 | |
实现功能 | |||
松散绑定 | 支持 | 不支持 |
last_name==lastName
last-name ==lastName
|
SpEL | 不支持 | 支持 |
#{10*2}
|
复杂类型封装 | 支持 | 不支持 |
${emp.map}
|
JSR303
数据校验
| 支持 | 不支持 | 下文样例 |
JSR303数据校验_配置文件注入的值
校验是否为合法的邮箱地址
:
- 取消 @ConfifigurationProperties(prefifix = "emp") 前面的注释
- 在Emp 类上添加 @Validated 数据校验注解
- 在 name 属性上添加 @Email 注解
- 验证 @ConfifigurationProperties 会进行校验, 而 @Value 不会进行校验值
@Component
@ConfigurationProperties(prefix = "emp")
@Valid
public class Emp {
@Email
private String name;
private Integer age;
private String birthday;
private Boolean boss;
private Double salary;
private Map map;
private List list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
…………
}
加载指定配置文件
@PropertySource加载局部配置文件
@ConfifigurationProperties
默认从全局配置文件
(application.properties/application.yml)
中获取值
,
所有配置数据写在全局配置文件中,显得太臃肿了
,
可将它们抽取出来,放到其他局部配置文件中。
@PropertySource
:用于加载局部配置文件
;
1.
将 全局配置文件 中的
emp
相关配置数据 抽取 到
resources/
emp.properties
文件中
2.
@PropertySource
:加载指定的配置文件
; value
属性是数组类型
,
用于指定文件位置,其余不变。
@PropertySource(value = {"classpath:emp.properties"})
@Validated
@Component
@ConfigurationProperties(prefix = "emp")
public class Emp {
………………
}
@ImportResource 使用xml配置
SpringBoot
提倡零配置, 即无
xml
配置,但是在实际开发中,可能有一些特殊要求必须使用
xml
配置;
这时我们可以通过
Spring
提供的
@ImportResource
来加载
xml
配置文件。
@ImportResource :加载
Spring
的
xml配置文件内容加载到容器中使用;
我们创建一个业务类。
public class EmpService {
public void add(){
System.out.println("add()....");
}
}
创建
resources/spring01.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">
<bean id="empService" class="com.example.demo.service.EmpService">
</bean>
</beans>
自定义配置类向容器注入组件(springboot推荐使用)
Spring Boot
推荐使用注解的方式向容器中注入组件
, 操作如下:
- 使用 @Confifiguration(写到类上面,相当于表示这是一个xml配置文件) 配置类,来表示对应Spring配置文件(xml文件)。
- 使用 @Bean 向容器中注入组件对象(写到方法上面,表示这是向容器中注入的一个组件)。
- 把上面 @importResource 注解注释掉测试。
package com.example.demo.config;
import com.example.demo.service.EmpService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EmpConfig {
@Bean
public EmpService empService() {
System.out.println("@Bean 注入组件");
return new EmpService();
}
}
@SpringBootTest
class DemoApplicationTests {
@Autowired
Emp emp;
@Autowired
ApplicationContext context;
@Test
void contextLoads() {
System.out.println(emp);
}
@Test
void empSerrviceTest() {
System.out.println("empService: " + context.getBean("empService"));//方法的名字
}
}
Profifile 多环境支持
Profifile介绍
Profifile
是
Spring
用来针对不同的环境要求,提供不同的配置支持, 全局
Profifile
配置使用的文件名可以是
application-{profifile}.properties
/
application-{profifile}.yml
;
如
: application-dev.properties / application-prod.properties
演示案例:我们的项目环境分为 开发 (
dev
)和 生产(
prod
)环境 ,开发环境下端口号为
8081
,
生产环境下端口号为8082
properties 文件演示案例
第一次:
结果:
第二次:
结果:
yml 文件演示案例
yml主配置文件同理,另外yml配置文件支持多文档快方式,如下:
server:
port: 8080 #默认端口
spring:
profiles:
active: dev
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
运行结果:
此外我们打成jar包命令行运行的时候也可以指定,例如:
java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
配置文件加载位置
springboot启动时,会扫描以下位置的 application.properties 或者 application.yml 文件作为 Spring Boot的
默认配置文件
:
配置文件的位置 | 说明 |
fifile:./config/
|
当前项目的
confifig
目录下(最高级别)
|
fifile:./
|
当前项目的根目录下
|
classpath:/config/
|
类路径的
confifig
目录下
|
classpath:/
|
类路径的根目录下(最低级别)
|
请看下图:
推荐把配置文件写在第三级别classpath:/config/下
如果您觉得,对您有帮助,请点个赞,感谢~~~