配置文件
spring boot使用一个全局配置文件(文件名固定),分两种application.properties
和application.yml
,用于修改spring boot自动配置的默认值。
YAML(YAML Ain't Markup Language)
标记语言:
- 以前的配置文件大多使用xml文件
- YAML以数据为中心,比json、xml等更适合做配置文件
基本语法:
- k:(空格)v : 表示一对键值对
以空格的缩进来控制层级关系,只要是左对齐的一列数据都是同一层级的
server:
port: 8080
属性和值大小写敏感
值得写法:
- 字面量:普通的值(数字、字符串、布尔)
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: 18}
- 数组(List、Set):用
-
值表示数组中的元素
行内写法pets: - cat - dog - pig
pets: {cat,dog,pig}
实例:配置文件值注入
在bean包下创建两个javabean,Person
和Dog
- javabean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
(将配置文件中配置的每个属性值映射到这个组件中
)
@ConfigurationProperties(prefix = "person"):
该注解告诉spring boot将本类中的所有属性和配置文件中相关的配置进行绑定;prefix = "person"
指定配置文件下哪个标签下面的属性进行一一映射。
@Component:
标注这是一个组件,只有容器中的组件才能使用容器提供的@ConfigurationProperties
功能。
- 配置文件
person:
lastName: zhangsan
age: 18
boss: false
birth: 2019/2/1
maps: {k1: v1,k2: 18}
lists:
- lisi
- lili
dog:
name: 小狗
age: 12
- 配置文件处理器
IDE提醒添加的依赖,这样在配置文件中编写代码时就有提示了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@ConfigurationProperties和@Value
@Value用法:
public class Person {
@Value("小明") //直接赋值
private String lastName;
@Value("#{11 * 2}") //表达式
private Integer age;
@Value("${person.boss}") //从配置文件中获取值
private Boolean boss;
private Date birth;
使用@Value
需要在javabean中一个一个配置。
. | @ConfigurationProperties | @Value |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个一个配置 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL(表达式) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 松散绑定:形如
person.last-name
,用 - 代替驼峰 - JSR303数据校验
@Validated public class Person { @Email //指定只能赋Email格式的值 @Value("${person.lastName}") private String lastName;
- 复杂类型封装:
@Value
无法配置Map、List等复杂类型的属性
小结:
- 如果只是要用一个配置文件中的某个值,则用
@Value
- 如果写了个javabean来和配置文件中的属性进行绑定,则用
@ConfigurationProperties
@PropertySource和@ImportResource
-
@PropertySource
@ConfigurationProperties
注解默认使用全局配置文件对JavaBean进行配置,而@PropertySource
注解可以指定一个配置文件来为JavaBean配置。@PropertySource(value = {"classpath:person.properties"}) @Component @ConfigurationProperties(prefix = "person") public class Person {
(只支持.properties文件
)
-
@ImportResource
导入spring的配置文件,让配置文件里的内容生效;
spring boot中没有spring的配置文件,它无法识别我们编写的配置文件,因此需要在主配置类上使用@ImportResource
将spring配置文件加载进来@ImportResource(locations = {"classpath:beans.xml"}) @SpringBootApplication public class ConfigurationApplication {
spring boot推荐使用全注解的方式添加组件
- 用配置类代替spring配置文件
- @Bean将对象添加到容器中
如下是一个配置类
/**
* @Configuration 指明该类是一个配置类,替代了之前spring的配置文件
* 以前使用<bean></bean>添加组件
*/
@Configuration
public class MyAppConfig {
@Bean //将方法返回值添加到容器中,默认id是方法名
public HelloService helloService(){
return new HelloService();
}
}
配置文件的占位符
person.lastName = 李四${random.int}
person.age = ${random.int}
person.boss = false
person.birth = 2017/12/12
person.maps.k1 = v1
person.maps.k2 = 12
person.lists = lisi,zhaoliu
person.dog.name = ${person.lastName}_小狗
person.dog.age = 2
${}
可以用于获取之前配置过的值,如person.dog.name = ${person.lastName}_小狗
如果没有值,可以指定默认值,如person.dog.name = ${person.lastName:李四}_小狗
网友评论