配置文件
spring boot使用一个全局的配置文件,配置文件名是固定的;
· application.properties
· application.yml
配置文件的作用:修改spring boot自动配置的默认值。
yml是YAML语音的文件,以数据为中心,比json、xml更适合做配置文件
标记语言
以前的配置文件:大多使用**xxxx.xml**文件
现在:YAML
server:
port: 8081
xml:
<server>
<port>8081</port>
</server>
YAML语法
基本语法
k:(空格)v:表示一对键值对(空格必须有)
以**空格**的缩进来控制层级关系;(只要是左对齐的一列数据,都是同一个层级的)
server:
port: 8081
path: /hello
属性和值也是大小写敏感的。
值的写法
字面量:普通的值(数字、字符串、布尔值):
k: v:字面直接来写;
字符串默认不用加上单引号或双引号
"":双引号:不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思
name: "zhangsan \n lisi";输出:zhangsan换行 lisi
'':单引号:会转义特殊字符,特殊字符最终会被转义为一个普通的字符串
name: 'zhangsan \n lisi';输出:zhangsan \n lisi
对象、Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值,注意用空格控制缩进
对象还是K: v的方式
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 20}
数组(list、Set):
用-(空格)值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
配置文件值注入
配置文件
person:
LastName: zhangsan
age: 18
boss: false
birth: 2003/06/16
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhaoliu
dog:
name: uzi
age: 19
person.last-name=张三
person.age=18
person.birth=1995/06/06
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=5
JavaBean
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties : 告诉spring boot将本类中的所有属性和配置文件中相关的属性进行绑定
* prefix = "person": 告诉配置文件中是哪一个下面的所有属性进行一一映射
* 只有这个组件时容器中的组件,才能使用容器中提供的@ConfigurationProperties功能
* @author Alex
* @create 2019-12-18 16:35
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String LastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map maps;
private List lists;
private Dog dog;
}
导入配置文件处理器,这样编写配置文件的时候会有提示
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Value和@ConfigurationProperties获取值比较
功能:@Value(一个个指定)、@ConfigurationProperties(批量注入配置文件中的属性)
松散绑定(松散语法):@Value(不支持)、@ConfigurationProperties(支持)
SpEL:@Value(支持)、@ConfigurationProperties(不支持)
JSR303数据校验:@Value(不支持)、@ConfigurationProperties(支持)
复杂类型封装时:@Value(不支持)、@ConfigurationProperties(支持)
如果我们只是在某个业务逻辑中获取一下配置文件中的某项值,使用@Value
如果我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
配置文件注入值数据校验
@Validated和@Email
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
/**
*<property name="lastName" value="1:字面量;2:${key}从环境变量/配置文件中获取值;3:#{SpEL}spring表达式;">
*/
// @Value("${person.last-name}")
// lastName必须时邮箱格式
private String LastName;
}
@propertySource和@ImportResource
@propertySource:加载指定的配置文件
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {
/**
*
* <property name="lastName" value="1:字面量;2:${key}从环境变量/配置文件中获取值;3:#{SpEL}spring表达式;">
*
*/
// @Value("${person.last-name}")
// lastName必须时邮箱格式
private String LastName;}
@ImportResource:导入spring的配置文件,让配置文件里面的内容生效
spring boot里面没有spring的配置文件,我们自己编写的配置文件,也不能被自动识别。
想让spring的配置文件生效,加载文件,就需要@ImportResource注解,将此注解标注在一个配置类上。
@ImportResource(locations = {"classpath:beans.xml"})
导入spring的配置文件,让其生效
spring boot推荐给容器中添加组件的方式:推荐使用全注解的方式
1、配置类(类似于spring的配置文件)
<?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="helloService" class="com.example.demo.service.HelloService"></bean></beans>
2、使用@Bean给容器中添加组件
/**
* @Configuration : 指明当前类是一个配置类,相当于spring的配置文件
* 以前在配置文件中是通过<bean></bean>标签来添加组件的
* @author Alex
* @create 2019-12-19 11:44
*/
@Configuration
public class MyAppConfig {
/**
* 将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
* @return
*/
@Bean
public HelloService helloService(){
System.out.println("配置类@bean给容器中添加组件了。。。");
return new HelloService();
}
}
配置文件占位符
1、随机数
${random.value}、${random.int}、${random.long}、${random.int(10)}、${random.int[1024,65536]}
2、占位符获取之前配置的值,如果没有,可以使用:指定默认值
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=1995/06/06
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=5
配置文件加载位置
spring boot启动会扫描以下位置的application.properties或者application.yml文件作为spring boot的默认配置文件
——file:./config/
——file:./
——classpath:/config
——classpath:/
——以上是按照**优先级从高到低**的顺序,所有位置的文件都会被加载,高优先级配置的内容会覆盖低优先级配置内容
但是我这边配置的时候,根目录下的配置文件不能生效,只能生效resource文件夹下面的。
spring boot会从这四个位置全部加载主配置文件,互补配置
——**我们也可以通过配置spring.config.location来改变默认配置**
spring.config.location使用环境:项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,
指定的配置文件和默认加载的配置文件会共同起作用,形成互补配置。