配置文件的优先级
application.properties和application.yml文件可以放在以下四个位置:
- 外置,在相对于应用程序运行目录的/congfig子目录里。
- 外置,在应用程序运行的目录里
- 内置,在config包内
- 内置,在Classpath根目录
同样,这个列表按照优先级排序,也就是说,src/main/resources/config下application.properties覆盖src/main/resources下application.properties中相同的属性,如图:
1.自定义属性与加载
com.gwd.name=guweidong
com.gwd.blog.title=Spring Boot教程——属性配置文件详解
然后通过@Value("${属性名}")注解来加载对应的配置属性,具体如下:
@Component
public class BlogProperties {
@Value("${com.gwd.name}")
private String name;
@Value("${com.gwd.blog.title}")
private String title;
// 省略getter和setter
}
测试用例如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {
@Autowired
private BlogProperties blogProperties;
@Test
public void getHello() throws Exception {
Assert.assertEquals(blogProperties.getName(), "guweidong");
Assert.assertEquals(blogProperties.getTitle(), "Spring Boot教程——属性配置文件详解");
}
}
参数间的引用
com.gwd.name=guweidong
com.gwd.blog.title=Spring Boot教程——属性配置文件详解
com.gwd.desc=${com.gwd.name}在写${com.gwd.blog.title}
使用随机数
# 随机字符串
com.gwd.blog.value=${random.value}
# 随机int
com.gwd.blog.number=${random.int}
# 随机long
com.gwd.blog.bignumber=${random.long}
# 10以内的随机数
com.gwd.blog.test1=${random.int(10)}
# 10-20的随机数
com.gwd.blog.test2=${random.int[10,20]}
通过命令行来设置属性值
相信使用过一段时间Spring Boot的用户,一定知道这条命令:java -jar xxx.jar --server.port=8888,通过使用–server.port属性来设置xxx.jar应用的端口为8888。在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。
多环境配置
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
-
application-dev.properties
:开发环境 -
application-test.properties
:测试环境 -
application-prod.properties
:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties
文件中通过spring.profiles.active
属性来设置,其值对应{profile}
值。
如:spring.profiles.active=test
就会加载application-test.properties
配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
-
针对各环境新建不同的配置文件
application-dev.properties
、application-test.properties
、application-prod.properties
-
在这三个文件均都设置不同的
server.port
属性,如:dev环境设置为1111,test环境设置为2222,prod环境设置为3333 -
application.properties中设置
spring.profiles.active=dev
,就是说默认以dev环境设置 -
测试不同配置的加载
- 执行
java -jar xxx.jar
,可以观察到服务端口被设置为1111
,也就是默认的开发环境(dev) - 执行
java -jar xxx.jar --spring.profiles.active=test
,可以观察到服务端口被设置为2222
,也就是测试环境的配置(test) - 执行
java -jar xxx.jar --spring.profiles.active=prod
,可以观察到服务端口被设置为3333
,也就是生产环境的配置(prod)
- 执行
按照上面的实验,可以如下总结多环境的配置思路:
-
application.properties
中配置通用内容,并设置spring.profiles.active=dev
,以开发环境为默认配置 -
application-{profile}.properties
中配置各个环境不同的内容 - 通过命令行方式去激活不同环境的配置
除了可以用profile的配置文件来分区配置我们的环境变量,在代码里,我们还可以直接用@Profile注解来进行配置,例如数据库配置,这里我们先定义一个接口
1
| public interface DBConnector { public void configure(); }
|
分别定义俩个实现类来实现它
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 测试数据库 */ @Component "testdb") (public class TestDBConnector implements DBConnector { public void configure() { System.out.println("testdb"); } } /** * 生产数据库 */ @Component "devdb") (public class DevDBConnector implements DBConnector { public void configure() { System.out.println("devdb"); } } |
通过在配置文件激活具体使用哪个实现类
1
| spring.profiles.active=testdb
|
然后就可以这么用了
1 2 3 4 5 6 7 8 9 10 11 12 13 | @RestController "/task") (public class TaskController { DBConnector connector ; "/",""}) (value = { public String hellTask(){ connector.configure(); //最终打印testdb return "hello task !! myage is " + myage; } } |
除了spring.profiles.active来激活一个或者多个profile之外,还可以用spring.profiles.include来叠加profile
1 2 | spring.profiles.active: testdb spring.profiles.include: proddb,prodmq |