配置文件
=====================================================================================================
SpringBoot应用一个全局的配置文件,配置文件名application
是固定的;
- application.properties
- application.yml
- application.yaml
配置文件的作用:批改SpringBoot主动配置的默认值;SpringBoot在底层都给咱们主动配置好;
YAML
YAML(YAML Ain't Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn't Markup Language:不是一个标记语言;
标记语言:
以前的配置文件;大多都应用的是 xxxx.xml文件;
YAML:以数据为核心,比json、xml等更适宜做配置文件;
YAML语法:
根本语法
k:(空格)v:示意一对键值对(空格必须有);
以空格的缩进来管制层级关系;只有是左对齐的一列数据,都是同一个层级的
次等级的后面是空格,不能应用制表符(tab)
冒号之后如果有值,那么冒号和值之间至多有一个空格,不能紧贴着
值的写法
字面量:一般的值(数字,字符串,布尔)
k: v
字符串默认不必加上单引号或者双引号;
""
:双引号;不会本义字符串外面的特殊字符;特殊字符会作为自身想示意的意思
eg: name: "zhangsan n lisi":输入;zhangsan 换行 lisi
''
:单引号;会本义特殊字符,特殊字符最终只是一个一般的字符串数据
eg: 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]
配置文件值注入
在进行配置文件注入时,会同时加载application.properties和yml,不过properties的优先级更高,properties中没有配置的内容会应用yml的配置。
yml配置文件
person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: 小狗 age: 12
properties配置文件
person.last_name=张三person.age=18person.boss=trueperson.birth=2010/01/01person.maps.k1=mmmperson.maps.v1=aaaperson.maps.k2=dogperson.maps.v2.dog.name=xiaobeiperson.maps.v2.dog.age=3person.lists={abc,def,ghi}person.dog.name=wangcaiperson.dog.age=4
JavaBean:
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:通知SpringBoot将本类中的所有属性和配置文件中相干的配置进行绑定; * prefix = "person":配置文件中哪个上面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,能力容器提供的@ConfigurationProperties性能; * */@Component@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;
咱们能够导入配置文件处理器,当前编写配置就有提醒了
<!--导入配置文件处理器,配置文件进行绑定就会有提醒-->
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
测试,发现中文会乱码,而且char类型还会抛出Failed to bind properties under 'person.gender' to java.lang.Character异样
中文乱码解决办法:
properties配置文件在idea中默认utf-8可能会乱码
调整
在设置中找到File Encodings
,将配置文件字符集改为UTF-8
,并勾选:
Transparent native-to-ascii conversion
yaml和properties配置文件同时存在,properties配置文件的内容会笼罩yaml配置文件的内容
配置文件值注入有两种形式,一个是Spring Boot的@ConfigurationProperties
注解,另一个是spring原先的@value
注解
@Value获取值和@ConfigurationProperties获取值比拟
@ConfigurationProperties | @Value | |
---|---|---|
性能 | 批量注入配置文件中的属性 | 一个个指定 |
涣散绑定(涣散语法) | 反对 | 不反对 |
SpEL | 不反对 | 反对 |
JSR303数据校验 | 反对 | 不反对 |
简单类型封装 | 反对 | 不反对 |
- 涣散绑定:属性匹配规定
规范形式 person.firstName
形式一 大写用- person.first-name
形式二 大写用_ person.first_name
- SpEL:
#{表达式}
表达式内能够应用各类运算符 - JSR303数据校验: 对属性的格局校验,校验时在类上要标注
@Validated
,对字段的校验常见的有@Email
(是否是非法的邮件地址)、@NotNull
(是否非空)等 - 简单类型:比方map、类等
配置文件yml还是properties他们都能获取到值;
什么时候应该用什么
如果说,咱们只是在某个业务逻辑中须要获取一下配置文件中的某项值,应用@Value;
如果说,咱们专门编写了一个javaBean来和配置文件进行映射,咱们就间接应用@ConfigurationProperties;
测试
SpEL:
`## properties配置文件persion.age=#{11*}# Person类#--------------------应用@ConfigurationProperties注解,会抛出异样--------------------@Component@ConfigurationProperties(prefix = "person")public class Person { private Integer age;#--------------------应用@value注解 OK--------------------@Componentpublic class Person { @Value("${person.age}") private Integer age;`Copy to clipboardErrorCopied
JSR303数据校验
@ConfigurationProperties
反对校验,如果校验不通过,会抛出异样
@value
注解不反对数据校验
简单类型封装(外围区别)
@value
注解无奈注入map等对象的简单类型,但list、数组能够
@PropertySource&@ImportResource&@Bean
PropertySource
@PropertySource
注解的作用是加载指定的配置文件,值能够是数组,也就是能够加载多个配置文件
springboot默认加载的配置文件名是application
,如果配置文件名不是这个是不会被容器加载的,所以这里Person并没有被注入任何属性值
应用@PropertySource({"classpath:person.properties"})
指定加载person.properties
配置文件
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @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;
应用这个注解加载配置文件就须要配置类应用@component等注解而不是期待@EnableConfigurationProperties激活m,而且不反对yaml,只能是properties
ImportResource
@ImportResource
注解用于导入Spring的配置文件,让配置文件外面的内容失效;(就是以前写的springmvc.xml、applicationContext.xml)
Spring Boot外面没有Spring的配置文件,咱们本人编写的配置文件,也不能自动识别;
想让Spring的配置文件失效,加载进来;@ImportResource标注在一个配置类上
运行测试类
留神!这个注解是放在主入口函数的类上,而不是测试类上
Configuration
SpringBoot举荐给容器中增加组件的形式;举荐应用全注解的形式
配置类@Configuration ---equals---> Spring配置文件
Bean
应用@Bean给容器中增加组件
* @Configuration:指明以后类是一个配置类;就是来代替之前的Spring配置文件 * * 在配置文件中用<bean><bean/>标签增加组件 * */@Configurationpublic class MyAppConfig { //将办法的返回值增加到容器中;容器中这个组件默认的id就是办法名 @Bean public HelloService helloService02(){ System.out.println("配置类@Bean给容器中增加组件了..."); return new HelloService(); }}
配置文件占位符
随机数
${random.value}、${random.int}、${random.long}${random.int(10)}、${random.int[1024,65536]}
能够援用在配置文件中配置的其余属性的值,如果应用一个没有在配置文件中的属性,则会原样输入
能够应用:
指定默认值
Profile
Profile是Spring对不同环境提供不同配置性能的反对,能够通过激活、指定参数等形式疾速切换环境
多profile文件模式
文件名格局:application-{profile}.properties/yml,例如:
- application-dev.properties
- application-prod.properties
程序启动时会默认加载application.properties
,启动的端口就是默认端口,个别是8080(因为我后盾还跑着Sts端口被占用了,所以设置为8081了)
能够在主配置文件中指定激活哪个配置文件
yml反对多文档块形式
每个文档块应用---
宰割
server: port: 8081spring: profiles: active: prod---server: port: 8083spring: profiles: dev---server: port: 8084spring: profiles: prod #指定属于哪个环境
激活指定profile的三种形式
- 在配置文件中指定 spring.profiles.active=dev
我的项目打包后在命令行启动
`java -jar xxx.jar --spring.profiles.active=dev;
虚拟机参数
`-Dspring.profiles.active=dev`Copy to clipboardErrorCopied
激活优先应用多profile文件,如果指定的环境在多profile没有配置,才会应用多文档块中的内容
配置文件加载地位
springboot 启动会扫描以下地位的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
优先级由高到底,高优先级的配置会笼罩低优先级的配置;
SpringBoot会从这四个地位全副加载主配置文件;互补配置(高一级没有的从下一级补足);
==咱们还能够通过spring.config.location来扭转默认的配置文件地位==
我的项目打包好当前,咱们能够应用命令行参数的模式,启动我的项目的时候来指定配置文件的新地位;指定配置文件和默认加载的这些配置文件独特起作用造成互补配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
内部配置加载程序
==SpringBoot也能够从以下地位加载配置; 优先级从高到低;高优先级的配置笼罩低优先级的配置,所有的配置会造成互补配置==
1.命令行参数
所有的配置都能够在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格离开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java零碎属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
==由jar包内向jar包内进行寻找;高优先级笼罩低优先级==
==优先加载带profile==
6.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
==再来加载不带profile==
8.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有反对的配置加载起源;
参考官网文档