Spring Boot使用一个全局的配置文件,配置文件名是固定的,有两种方式;
配置文件的作用:修改Springboot自动配置的默认值。
YAML(yml:YAML Ain’t Markup Language):是一个标记语言又不是一个标记语言
标记语言:以前的配置文件,大多数使用xml文件;现在yml:以数据为中心,比json、xml等更适合做配置文件;
YAML配置例子:
server:
port: 8081
XML例子:
8081
k:(空格)v
:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要左对齐的一列数据,都是一个层级的
属性和值也是大小写敏感
k: v
:
k: v
:在下一行来写对象的属性和值的关系;注意缩进
friends:
lastName:zhangsan
age:20
friends:{lastName:zhagnsan,age:18}
- 值
表示数组中的一个元素pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
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配置就有提示
org.springframework.boot
spring-boot-configuration-processor
true
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注解配合相应校验注解) | 不支持 |
复杂类型封装取值 | 支持 | 不支持 |
得出:
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;
}
}
/**
* 将文件中配置的每一个属性的值,映射到这个组件中
* @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(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推荐给容器添加组件的方式推荐使用全注解的方式
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();
}
}
可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
${app.name:默认值}来指定找不到属性是的默认值(用冒号指定默认值)
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
默认使用application.properties,在这里输入spring.profiles.active=dev
我们在配置住配置文件时,文件名可以是:
server:
port: 8080
#文档块
spring:
profiles:
active: dev #激活,默认就是8080
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: prod #指定属于那个配置
高优先级的配置会覆盖低优先级的配置
Springboot会从这四个位置全部加载配置文件,进行互补配置
server.context-path=:表示配置项目访问路径
我们可以通过spring .config.localhost
来改变默认的配置路径:项目打包好后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件共同起作用形成互补配置。
Springboot支持多种外部配置,优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置