yaml(YAML Ain’t Markup Language)
语言文件, 已数据为中心, 比json, xml等 更适合做配置文件
配置端口号为80;
server: port: 80 # 项目访问路径 context-path:/属性和值区分大小写
key: value : 表示一对键值对(空格必须有);
以空格的缩进控制层级关系, 只要是左对齐的一列数据都是同一层级
server: prot:80 path: /hellok: v
字符串默认不加单引号或双引号
"":双引号; 不会转义字符串中的特殊字符, 特殊字符会作为本身想表示的意思
name: "zhangshan\nlisi" --- 张三 换行 李四'': 单引号; 会转义特殊字符, 特殊字符最终只是一个普通字符串数据
name: 'zhangshan\nlisi' --- 张三\n李四k: v
对象 / Map
# 普通写法 people: name: zhangsan age: 20 # 行内写法 user: {username: zhangsan, age: 20}用- 值表示数组中的一个元素
# 普通写法 pets: - cat - dog - pig # 行内写法 pets: [cat,dog,pig]随机数
${random.value} ${random.int} ${random.long} ${random.int(10)} ${random.int[1024, 65536]}占位符
获取之前配置的值, 如果没有可以使用:指定默认值
person.dog.age=${person.ages:10}yaml配置文件编写
person: name: harlan age: 24 sex: true birth: 1997/11/17 map: {k1: v1, k2: v2, k3: v3} list: - first - secound - three - four - five dog: name: doudou age: 2domain编写:
@Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private Integer age; private Boolean sex; private Date birth; private Map<String, Object> map; private List<Object> list; private Dog dog; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getSex() { return sex; } public void setSex(Boolean sex) { this.sex = sex; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } public List<Object> getList() { return list; } public void setList(List<Object> list) { this.list = list; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog = dog; } }需要在domain中添加@ConfugurationProperties注解, 并指定前缀, 然后使用@Component注解添加到Spring容器中
注意:同时我们可以在pom中导入配置文件处理器, 使得编写yaml配置时有提示信息
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>使用application.proties配置
person.name=harlan person.age=23 person.birth=1997/11/17 person.list=a,b,c person.map.k1=v1 p erson.map.k2=v2 person.sex=true如果说, 欧美只是在某个业务逻辑中需要获取一下配置文件中的某项值, 使用@Value注解
@ConfigurationProperties@Value功能批量注入配置文件中的属性一个一个指定松散绑定(松散语法)支持不支持SpEL不支持支持JSR303数据校验(@Validated)支持不支持复杂类型封装支持不支持需要导入数据校验场景依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>在需要校验的属性上添加校验注解
@Component @Validated @ConfigurationProperties(prefix = "person") public class Person { @Email private String email; ... }用于加载指定的配置文件
@Component @ConfigurationProperties(prefix = "person") @PropertySource(value = {"classpath:person.properties"}) public class Person { ... }用于导入Spring的配置文件, 让配置文件中的内容生效
作用于主配置类上, 导入需要的spring配置文件
@SpringBootApplication @ImportResource(locations = {"classpath:beans.xml"}) public class ConfigApplication { public static void main(String[] args) { SpringApplication.run(ConfigApplication.class, args); } }在类中加上@Configuration注解, 指定当前类是一个配置类, 其作用相当于Spring的配置文件
/** * @Configuration:指明当前类是一个配置类, 就是来替代之前的Spring配置文件 * 在配置文件中使用<bean>标签添加组件 * @Author Harlan * @Date 2020/10/3 */ @Configuration public class MyAppConfig { /** * 将方法的返回值添加到容器中 * @return helloService */ @Bean public HelloService helloService(){ return new HelloService(); } }其作用在方法上, 用于将方法的返回值注入到IoC容器中, 相当于Spring配置文件中的<bean>标签
/** * 将方法的返回值添加到容器中 * @return helloService */ @Bean public HelloService helloService(){ return new HelloService(); }我们在著配置文件编写的时候, 文件名可以是 application-{profile}.properties/.yml
默认使用application.properties/.yml配置文件
使用---来分割不同的配置信息
profiles: 指定模式名称
active: 指定激活
spring: profiles: active: prod server: port: 8080 --- spring: profiles: dev server: port: 8081 --- spring: profiles: prod server: port: 80在配置文件中指定spring.profiles.active=dev
spring: profiles: active: dev命令行方式激活
--spring.profile.active=dev
将项目打成jar包, 使用cmd命令指定参数
-Dspring.profiles.active=dev
spring boot启动会扫描以下位置的application配置文件作为Spring Boot的默认配置文件.
file:./config/ > file:./ > classpath:./config/ > classpath:./
以上按照优先顺序从高到低加载, 所有位置的文件都会被加载, 高优先级配置内容会覆盖低优先级配置内容, 其他配置内容互补.
同时我们也可以通过配置spring.config.location来改变默认配置
SpringBoot也可以从以下位置加载配置, 按照优先级从高到低; 高优先级的配置覆盖低优先级配置, 其余互补
命令行参数
java -jar spring-boot-xxx-xxx-xxx-SNAPSHOT.jar --server.prot=80 --server.context-path=/hello
来自java:comp/env的JNDI属性
Java系统属性(System.getProperties)
操作系统环境变量
RandomValuePropertySource配置random.*属性值
优先加载带profile的配置文件, 由jar包外向jar包内寻找
jar包外部的application-{profile}.properties/yml(带Spring.profile)配置文件
jar包内部的application-{profile}.properties/yml(带Spring.profile)配置文件
jar包外部的application.properties/yml(不带Spring.profile)配置文件
jar包内部的application.properties/yml(不带Spring.profile)配置文件
@Configuration注解类上的@PropertySource
通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置参考SpringBoot参考官方文档: https://spring.io/guides#getting-started-guides
未学习明白!