boot中的配置文件
虽然我们的spring boot没有了繁琐的xml配置文件,但是依然是有配置文件来解决一些问题的。
这里提供了两种配置文件,yaml(yam)和properties
当然这里也是有规范的,比如:SpringBoot使用一个全局的配置文件,配置文件名application
是固定的;
比如:
application.propertiesapplication.ymlapplication.yaml
两种配置文件的介绍
♥ yaml
全称为:YAML Ain't Markup Language,是一个标记语言。
在以前的配置文件,大多数是使用xml配置文件,yaml的理念是以数据为中心,相比xml,这种方式更加的适合当作配置文件。
我们来看一下这个对比(假设配置一个端口号):
xml的方式如下:
<server> <port>8081port>server>
然后使用properties配置:server.port=8090
使用yaml配置如下:
server: port: 8090
是不是相比较xml的方式简洁的多。
然后来详细讲解这个的语法规则:
key:(这里一定要空格,这是规定)value,yaml就是用key,value的形式配置。
这个和之前的没多大区别。但是层次关系就不一样,比如 server.port=8090
,这个是以 . 作为区分层次关系,如果还有一个server里面的子项,又是server.xxx=xx,在properties中就有需要一行来配置,而yaml中:
server: port: 8080 //注意,port:这后面是带有空格的 xxxx: xxx
这样能够一眼看出这个层次关系。是不是特别的方便!
注意:
用缩进的空格数来表示层级关系,缩进的空格数相等,就表示是同一层。
对于key,应该是没有什么问题,需要配置什么就写什么,但是value需要我们好好的注意一下:
字面量:普通的值(数字,字符串,布尔)
对于字面量我们不需要任何特殊的写法,直接是啥写啥。=比如是字符串,也不需要引号,数字直接写就好。同时对于字符串有如下的规则:
单引号:' ',会转义里面的特殊字符,就是将特殊字符直接作为字符,例如: key: '122\nsss',输出就直接是122\nsss
双引号:“ ”,不会转义特殊字符,也就是将原意表达,例如: key: “122\nsss”,输出就直接是122 换行 sss
value为对象,Map形式就如下:
friends: name: lisi age: 12# 对象的写法和 map的写法一样# 还有一种行内写法如下,value类似json格式friends: {name: lisi,age: 12}
value为数组(List,Set等等)这个有点点区别:以 -(空格)来表示里面的值
list: - cat # 注意这个是用一个 “-”后面跟上一个空格在添加我们的值 - dog - xxx# 还有一种行内写法:list: [cat,dog,xxx]
简单的练习如下:(假设我们需要给一个对象从配置文件中绑定值)
这个是我们需要绑定的对象
/** * @ConfigurationProperties注解的使用:告诉springboot将这个类中的所有属性和全局配置文件中的数据进行绑定 * prefix = "person",对应配置文件中的key, * 注意:我们获取这个对象,所以需要将这个对象加入容器@Component。同时,由于这个自动赋值的过程是由spring完 * 成,所以这个组件必须放入容器,才能被赋值 */@Setter@Getter@ToString@ConfigurationProperties(prefix = "person")@Componentpublic class Person { private String name; private int age; private Map map; private List list; private Cat cat;}
然后就是对应的配置文件如下:
person: name: 漳卅 age: 15 map: {name: lisi,age: 33} list: - lisi - sss cat: name: aaa age: 11
然后我们进行测试:
@RunWith(SpringRunner.class)@SpringBootTestclass SpringBoot1ApplicationTests { @Autowired Person person; @Test void contextLoads() { //直接输出即可 System.out.println(person); }}
这样我们就可以从配置文件配置这个对象的属性。同时有一个小的点:
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-configuration-processorartifactId> <optional>trueoptional>dependency>
好了,基本的yaml的写法就是这样的,自己多加练习即可!
再来看看properties的写法
♥ properties
用上面配置对象的属性为例,配置的写法不同,比如,person的属性:
person.name="张三"person.age=12person.map.key1=v1person.map.key2=v2person.list=a,b,cperson.cat.name="sss"person.cat.age=1
总的来说这两种配置文件是看个人的喜好来的,没有优略之分,个人而言,还是yml的形式比较舒服
还记得上面的例子中用到的一个注解:@ConfigurationProperties这个注解吗?这个注解就是可以绑定我们的配置文件,将名称对应的属性和配置文件中的值进行绑定。然而,我们还有一个@Value这个注解也可以向一个对象注入相应的属性。
@Value和@ConfigrationProperties
@Value | @ConfigrationProperties | |
功能 | 单个属性注入 | 批量属性注入 |
松散绑定(也就是有点驼峰命名的意思) | 不支持 | 支持 |
SpEl表达式 | 支持 | 不支持 |
JSR303数据校验 | 不支持 | 支持 |
复杂类型绑定 | 不支持 | 支持 |
@Setter@Getter@ToString@Componentpublic class Person { @Value("苏丹国") private String name; @Value("12") private int age; private Map map; private List list; private Cat cat;}@Setter@Getter@ToString@ConfigurationProperties(prefix = "person")@Component@Validatedpublic class Person { @Email //加上@Validated这个注解后可以使用这个JSR303校验, private String name; private int age; private Map map; private List list; private Cat cat;}
加上@Validated这个注解后@ConfigrationProperties配置的数据可以使用这个JSR303校验。
@Value这个注解,可以直接注入字面量(没有用表达式),也可以用${}这个来取出全局配置文件中的对应的值,还可以使用sPEl表达式。
再来看看另一个注解:
@PropertySource(value = {"classpath:person.properties"})
加载指定的配置文件中的值,如果一股脑地把所有东西都写在全局配置文件,显然,不够优雅,我们可以自己指定自己写的配置文件去加载,就用上面这个注解,还可以写多个值,加载多个配置文件。这个注解不支持加载yaml
@Setter@Getter@ToString@ConfigurationProperties(prefix = "person")@Component@PropertySource(value = {"classpath:person.properties"})//@Validatedpublic class Person { //@Email //加上@Validated这个注解后可以使用这个JSR303校验, private String name; private int age; private Map map; private List list; private Cat cat;}
这样加载指定的配置文件看起来就会比较清晰明朗!
同时由于我们没有了xml,用yam或者properties只能配置一些属性,如果我们需要定向的配置组件等等东西,我们可以利用spring纯注解的一个配置注解:@Configuration,这个注解的详细解释请看spring纯注解。
@Configurationpublic class MyConfig { //加入我们需要的配置即可}
配置文件占位符和Profile多环境支持
配置文件占位符
配置文件占位符:可以在配置文件中引用前面配置过的属性,使用${name:默认值}来指定找不到属性时的默认值,我们也可以在配置文件中可以写一些类似Java的代码${romdan.int},这个就可以在加载配置文件的时候随机生成值。例如:
# 这样在获取这个age的时候,会随机生成一个数age=${romdan.int}# 这样就可以获取到age的配置的值,假设我们没有配置这个age属性,这个name的值变成“${age}_张三”,也就是原样输出name=${age}_张三person.birth=2017/12/15person.boss=false
Profile多环境
多个配置文件中,我们可以指定某一个生效,这样我们可以针对开发环境和生产环境进行不同的配置
格式 : application-{profile}.properties/yml,例如:
application-one.properties application-two.properties默认使用application.properties文件的配置,可以在里面指定需要激活的环境,例如主配置文件加上这个配置spring.profiles.active=one,就指定使用application-one.properties 配置文件
yml配置文件多profile文档块模式:--- 表示分割,
spring: profiles: active: one#active:这个表示激活也就是使用哪个文档块---server: port: 8083spring: profiles: two#profiles: 表示这个文档块的一个标识---server: port: 8084spring: profiles: one# ---分割这个文件使得上下两部分成为一个单独的文件系统,只不过写在一起而已
然后我们指定激活的方式有这么几种:
1. 就是上面的在配置文件中配置 spring.profiles.active=dev
2. 我们使用Java -jar命令的时候,指定这个生效的配置:
java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;
3. 配置我们的虚拟机参数:-Dspring.profiles.active=dev
补充一个小的知识点:配置文件如果放在不同的位置,这个加载的顺序。(了解即可)
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/–file:./–classpath:/config/–classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与低优先级配置文件不冲突的属性,则会共同存在—互补配置(也就是如果高优先级配置文件没有配置,而低优先级的配置了,会自动地合并内容)。
我们还可以通过spring.config.location来改变默认的配置文件位置