配置文件
SpringBoot 的热部署
Spring为开发者提供了一个名为spring-boot-devtools的模块来使SpringBoot应用支持热部署,提高开发者的开发效率,无需手动重启SpringBoot应用
相关依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>
</dependency>
修改Java代码或者配置文件模块后可以通过ctrl+F9来实施热部署
配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的
- application.properties
- application.yml
配置文件的作用:修改SpringBoot自动配置的默认值。
YML:配置例子
server:port: 8080
XML:配置例子
<server><port>8080</port>
</server>
YML语法
基本语法
k:(1空格)v: 表示一对键值对(1个空格必须有)
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的
server:port: 8080path: /hello
其中的属性和值也是大小写敏感
值的写法
字符串默认不用加上单引号或双引号
“”:双引号:会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思,比如换行符(\n),如图:
我在双引号中间写了一个换行符,那么控制台输出这一行 person 信息的时候就会在 Jonathan 后面换行,如:
‘’:单引号:不会转义特殊字符,特殊字符只是一个普通的字符串数据,如图:
这次我把双引号换成了单引号,控制台输出的时候就不会换行了,只会把换行符当成普通字符处理,如:
对象,Map
对象
还是 k: v 的方式
friends:name: zhangsan age: 20
行内写法:
friends: {name: zhangsan,age: 18}
数组
用 - 值表示数组中的一个元素
pets:- cat- dog- pig
行内写法:
pets: {cat,dog,pig}
配置文件注入
配置文件:
person:name: 'Jonathan \n xxx'age: 27sex: "true"birthday: "1993/05/01"lists: [1,2,3]maps: {k1: 1,k2: 2,k3: 3}
javaBean:
/*** @ConfigurationProperties(prefix = "person")告诉SpringBoot将本类中的所有属性 * 和配置文件中相关的配置进行绑定*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {private String name;private int age;private boolean sex;private Date birthday;private List<Object> lists;private Map<String, Object> maps;
}
在这里我们可以导入配置文件处理器,以后编写配置就有提示了
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐configuration‐processor</artifactId><optional>true</optional>
</dependency>
我们可以通过另一种方式获取值
@Value和@ConfigurationProperties的区别
@Value | @ConfigurationProperties | |
---|---|---|
功能 | 一个个指定 | 批量注入配置文件中的属性 |
松散绑定(松散语法) | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型封装 | 不支持 | 支持 |
@Value是一一绑定的
@ConfigurationProperties支持松散绑定
数据校验:
只有前缀支持
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {@Emailprivate String email;
}
对于复杂封装类型 @Value 不适合,比如:
private List<Object> lists;private Map<String, Object> maps;
@PropertySource
/*** 将配置文件中配置的每一个属性的值,映射到这个组件中* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;* prefix = "person":配置文件中哪个下面的所有属性进行一一映射* *只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;* @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值;* */@PropertySource(value = {"classpath:person.properties"})@Component@ConfigurationProperties(prefix = "person")//@Validatedpublic class Person {/*** <bean class="Person">* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>* <bean/>*///lastName必须是邮箱格式// @Email//@Value("${person.last‐name}")private String lastName;//@Value("#{11*2}")private Integer age;//@Value("true")private Boolean boss;
@ImportResource:
导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来,就把@ImportResource放在SpringBoot启动类上
package com.qcby.springbootdemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;@ImportResource({"classpath:bean.xml"})
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
Profile
多Profile文件
我们在主配置文件编写的时候,文件名可以是 application-dev.properties
默认使用 application-dev.properties 的配置
yml支持多文档块方式
server:port: 8081
person:name: 'Jonathan \n xxx'age: 27sex: "true"birthday: "1993/05/01"lists: [1,2,3]maps: {k1: 1,k2: 2,k3: 3}
---
server:port: 8082
spring:config:activate:profiles: dev
---
server:port: 8083
spring:config:activate:profiles: prod
激活指定profile
在配置文件中指定 spring.profiles.active=dev
命令行:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
配置文件加载位置
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
优先级如图: