1、配置文件
Spring Boot使用一个全局的配置文件,配置文件名是固定的,有两种方式;
- application.properties
- application.yml
配置文件的作用:修改Springboot自动配置的默认值。
YAML(yml:YAML Ain’t Markup Language):是一个标记语言又不是一个标记语言
标记语言:以前的配置文件,大多数使用xml文件;现在yml:以数据为中心,比json、xml等更适合做配置文件;
YAML配置例子:
server:
port: 8081
XML例子:
<server>
<port>8081</port>
</server>
2、YAML语法
1、基本语法
k:(空格)v
:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要左对齐的一列数据,都是一个层级的
属性和值也是大小写敏感
2、值的写法
字面量:普通的值(数字,字符串,布尔)
k: v
:
- 字面直接来写;
- 字符串默认不用加上单引号或者双引号;
- “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
- 单引号:会转义特殊字符,特殊字符只会是一个普通的字符串数据
对象、map(属性和值)(键值对)
k: v
:在下一行来写对象的属性和值的关系;注意缩进
friends:
lastName:zhangsan
age:20
- 行内写法
friends:{lastName:zhagnsan,age:18}
数组(List、Set)
- 用
- 值
表示数组中的一个元素
pets:
- cat
- dog
- pig
- 行内写法
pets: [cat,dog,pig]
3、 配置文件值注入
yml 文件写法
yml文件
Person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: v2}
lists:
- lisi
- wangwu
dog:
name: 小狗
age: 2
@ConfigurationProperties的java文件
/**
* 将文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*/
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")//默认从全局变量中获取值
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
我们可以导入配置文件处理器,以后编写yml配置就有提示
<!-- 导入配置文件处理器,配置文件绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
properties文件写法
person.last-name=张三
person.age=18
person.birth=2019/12/12
person.boss=false
person.lists=a,b,c
person.maps.k1=v1
person.maps.k2=v2
person.dog.name=dog
person.dog.age=2
注入方式比较
区别 | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件的属性 | 单个注入 |
松散语法注入 | 支持 | 不支持 |
SpEL支持 | 不支持 | 支持 |
JSR303数据校验 | 支持(类上使用@Validated注解配合相应校验注解) | 不支持 |
复杂类型封装取值 | 支持 | 不支持 |
得出:
- 我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
例如:
package ink.poesy.springboot01helloworldquick.Controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController//@ResponseBody和@Controller的集合
public class HelloWorldQuick {
@Value("${Person.lastName}")//$为获取配置文件中的取值符号
String userName;
@RequestMapping("hello")
public String helloWorldQuick(){
return "Hello World Quick Create Spring Boot!我是" + userName;
}
}
- 如果说,我们专门编写一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
配置文件yml或是properties都能获取到值
配置文件注入值数据校验
/**
* 将文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*/
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")
@Validated//JSR303数据校验
public class Person {
@Email//校验规则
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@PropertySource
@PropertySource(value = {class path:person.properties}) :加载我们类路径下value下内容并把他们绑定到类路径下
/**
* 将文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉Spring boot 将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*/
@PropertySource(value = {"classpath:person.properties"})//********************************告诉Spring boot加载这个文件************************
@Component//只有组件是容器中的组件,才能容器提供的@ConfigurationProperties功能
@ConfigurationProperties(prefix = "person")
//@Validated//JSR303数据校验
public class Person {
//@Email//校验规则
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@ImportResource :导入Spring的配置文件,让配置文件里面的内容生效。
我们自己编写的配置文件Spring boot里面没有Spring的配置文件。把其标在配置类上使用太麻烦,不推荐使用了
package ink.poesy.springboot01helloworldquick;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@ImportResource(locations = {"classpath:beans.xml"})//导入Spring的配置文件,但这样太麻烦,看下面有Springboot推荐方法
@SpringBootApplication
public class SpringBoot01HelloworldQuickApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot01HelloworldQuickApplication.class, args);
}
}
Spring Boot推荐给容器添加组件的方式推荐使用全注解的方式
- 配置类==Spring配置文件
- @Configuration:指明当前类是一个配置类,即来代替之前的Spring配置文件
原在配置文件中使用
现使用@Bean:将方法的返回值添加到容器中:容器中这个组件默认的id就是方法名。
package ink.poesy.springboot01helloworldquick.config;
import ink.poesy.springboot01helloworldquick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//指明当前类是一个配置类;就是代替之前Spring的配置配件
public class MyAppConfig {
@Bean//将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
public HelloService helloService(){
return new HelloService();
}
}
配置文件占位符
RandomValuePropertySource:配置文件中可以使用随机数
- ${random.value}
- ${random.int}
- ${random.long}
- ${random.int(10)}
- ${random.int[1024,65536]}
属性配置占位符
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
${app.name:默认值}来指定找不到属性是的默认值(用冒号指定默认值)
Profile多环境支持
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
1、多profile文件形式
就是properties格式
默认使用application.properties,在这里输入spring.profiles.active=dev
我们在配置住配置文件时,文件名可以是:
- 格式:application-{profile}.properties:
- application-dev.properties
- application-prod.properties
配置文件目录结构
在application.properties文件中填写spring.profiles.active=dev
代码,激活指定profile
2、多profile文档块模式
就是yml格式
server:
port: 8080
#文档块
spring:
profiles:
active: dev #激活,默认就是8080
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod #指定属于那个配置
3、激活方式
- 命令行
–spring.profiles.active=dev
* 配置文件-Dspring.properfiles.active=dev - jvm参数
配置文件位置优先级高-》低
高优先级的配置会覆盖低优先级的配置
Springboot会从这四个位置全部加载配置文件,进行互补配置
server.context-path=:表示配置项目访问路径
我们可以通过spring .config.localhost
来改变默认的配置路径:项目打包好后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
外部配置加载顺序
Springboot支持多种外部配置,优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
- 命令行参数:可以修改一切Spring boot默认配置,多个参数中间用空格
- 来自java:comp/env的NDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的random.*属性值
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@ProoertySource
- 通过SpringApplication.setDefaultProperties指定的默认属性
配置文件可以有哪些选项
配置文件能配置的属性参照官方文档
注解解释:
遇见的错误
1 运行测试类发现汉字乱码
原因:xml默认编码是utf-8,我们需要进行编码转换
解决方法:把勾选的钩上
运行效果: