springboot之旅第二篇-配置
一、引言
虽然springboot帮我们进行了自动配置,但配置还是不可避免的,比如最简单的端口号,数据库连接。但springboot的配置一般不用xml进行配置,而是yml和properties,选择他们当然是因为他们更方便。
server: port: 8089
xml的写法是:
<server> <port>8081</port> </server>
直观上我们就能看到yaml的写法更简练,xml用了很大的空间放在标签的开闭上,而yaml不需要,下面我们来细讲yaml的语法。
二、
server: port: 8081 path: /hello
我们重点看看值的写法,值的写法是指可以用哪些写法来写值,一般有:字面量,对象、map,数组。
字面量:就是指普通的值(数字,字符串,布尔),这个写法就是直接k: v:方式,字符串默认不用加上单引号或者双引号,如果加了,那双引号和单引号是有区别的,区别在于是不是转义特殊字符,双引号会转义特殊字符,而单引号不会。如:
name: "yuanqinnan \n yuanyuan" 输出;yuanqinnan 换行 yuanyuan name: ‘yuanqinnan \n yuanyuan’:输出;yuanqinnan \n yuanyuan
friends: lastname: zhangsan age: 20
也可以一行完成
friends: {lastname: zhangsan,age: 18}
数组(list、set)
用- 值表示数组中的一个元素,如:
pets: - cat - dog - pig
记得- 后要打空格,这也有一行写法:
pets: [cat,dog,pig]
三、配置文件注入
配置文件写完,那么我们就要来使用了,下面讲配置文件值注入。
第一种方式@configurationproperties
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @configurationproperties:告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@configurationproperties功能; * */ @component @configurationproperties(prefix = "person") @data 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; }
这里为了少些一些代码,引入lombok,增加依赖,这个不清楚的同学自行百度了。
<dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.2</version> </dependency>
再建一个dog类:
@data public class dog { private string name; private integer age; }
然后在配置文件中加入以下配置:
server: port: 8089 person: lastname: hello age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: 小狗 age: 12
这里基本包含了我们需要的各种类型,直接在springbootlearnapplicationtests测试:
测试结果:
除了可以一次性注入之外,还有
//支持${} @value("${person.lastname}") private string lastname; //支持#{spel} @value("#{10*2}") private integer age; //支持字面量 @value("true")
两者有以下的区别:
@propertysource(value = {"xxx"})
我们应该怎么选择两种注入方式呢?
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@value。
如果说,我们专门编写了一个javabean来和配置文件进行映射,我们就直接使用@configurationproperties。
这里还要注意spring boot里面没有spring的配置文件,我们自己编写的配置文件,不能自动识别,什么意思呢?
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="helloservice" class="com.yuanqinnan.service.helloservice"></bean> </beans>
按照路径添加helloservice类,然后我们直接去获取bean,看看能不能取出来
测试方法:
@autowired applicationcontext ioc; @test public void beantest(){ boolean b = ioc.containsbean("helloservice"); system.out.println(b); }
@importresource(locations = {"classpath:beans.xml"})
这样才能注入进来,因为springboot是不推荐使用xml文件而使用注解方式,我们一般这么写
@configuration public class myappconfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名 @bean public helloservice helloservice2(){ system.out.println("配置类@bean给容器中添加组件了..."); return new helloservice(); } }
这样helloservice2就注入进来了
@test public void beantest2(){ boolean b = ioc.containsbean("helloservice2"); system.out.println(b); }
测试结果为true。
四、多个文件
在实际开发中,我们可能会有多个配置文件,比如本地的配置,测试的配置,正式的配置,这个时候我们就可以使用,一般我们会命名为:application-{profile}.properties/yml,那我们新建2个配置文件:
然后在application.yml加上
spring: profiles: active: dev
这样我们可以方便的切换环境配置,那上线的时候我们想改动配置文件怎么办呢?带参数命令就可以实现
java -jar springboot-learn-0.0.1-snapshot.jar --spring.profiles.active=dev;
我们可以用多个文件来进行配置,那么就会有优先级的问题,springboot是怎么做的呢?
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为spring boot的默认配置文件,并按照以下顺序进行扫描:
1、根目录下:./config/
2、根目录下:./
3、类路径下:/config/
4、类路径下classpath:/
优先级由高到底,如果后面的文件有相同配置则不起作用,这些配置文件都是互补配置,我们可以将需要的配置文件分类进行写入。
spingboot有很多自动配置类,并且为这些自动配置类提供了默认的properties,如数据库连接配置。
我们根据这个properties,再进行相应的属性配置:
五、总结
springboot启动会加载大量的自动配置类,我们看我们需要的功能有没有springboot默认写好的自动配置类,我们再来看这个自动配置类中到底配置了哪些组件,(只要我们要用的组件有,我们就不需要再来配置了)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值。