版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/saytime https://blog.csdn.net/saytime/article/details/74781708 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css">
<div class="htmledit_views" id="content_views">
SpringBoot 配置文件默认为application.properties,但是本章节主要讲解yaml文件配置,因为现在的趋势是使用yaml,它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。
一、自定义属性与加载
我们把之前项目中的配置文件application.properties改成application.yml
-
test:
-
user:
-
username : zhangsan
-
age :
18
-
toString: the age of
${test.
user
.username} is
${test.
user
.age}
属性类
-
package cn.saytime.bean;
-
-
import org.springframework.beans.
factory.
annotation.Value;
-
import org.springframework.stereotype.Component;
-
-
@Component
-
public
class PropertiesConfig {
-
-
@Value
(
"${test.user.username}"
)
-
private
String username;
-
-
@Value
(
"${test.user.age}"
)
-
private
String age;
-
-
@Value
(
"${test.user.toString}"
)
-
private
String toString;
-
-
// ... Getter Setter
-
-
}
测试Controller
-
package cn.saytime.web;
-
-
import cn.saytime.bean.PropertiesConfig;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestMethod;
-
import org.springframework.web.bind.annotation.RestController;
-
-
@RestController
-
public
class TestController {
-
-
@Autowired
-
private PropertiesConfig propertiesConfig;
-
-
@RequestMapping(value =
"test"
,
method =
RequestMethod.GET)
-
public String test(){
-
//
return
propertiesConfig.getUsername() +
":"
+ propertiesConfig.getAge();
-
return propertiesConfig.getToString();
-
}
-
}
二、自定义属性注入bean
将上面application.yml文件中的test.user注入到User对象里,注意这里的prefix指定的是test.user,对应配置文件中的结构
-
@Component
-
@ConfigurationProperties(prefix =
"test.user")
-
public
class User {
-
-
private String username;
-
-
private
int age;
-
-
public String getUsername() {
-
return username;
-
}
-
-
// Getter Setter
-
}
-
@
RestController
-
public
class
TestController
{
-
-
@
Autowired
-
private
User user;
-
-
@
RequestMapping
(value =
"test2"
,
method
=
RequestMethod
.
GET
)
-
public
String test2(){
-
return user.getUsername() +
":" + user.getAge();
-
}
-
}
访问 http://localhost:8080/test2 ==> zhangsan : 18
三、自定义额外的配置文件
比如我们不想把有些配置配置在application.yml/properties中。新建其他配置文件。这里比如新建test.yml文件。配置内容如上面的application.yml一样。那么我们注入对象时,应该这么写
-
@Configuration
-
@PropertySource
(value =
"classpath:test.yml"
)
-
@ConfigurationProperties
(prefix =
"test.user"
)
四、多个环境配置文件
在现实的开发环境中,我们需要不同的配置环境;格式为application-{profile}.properties,其中{profile}对应你的环境标识,比如:
- application-test.properties:测试环境
- application-dev.properties:开发环境
- application-prod.properties:生产环境
怎么使用?只需要我们在application.yml中加:
-
spring:
-
profiles:
-
active: dev
因为主入口都是application.yml,这里指定配置文件为dev,即启用application-dev.yml文件
其中application-dev.yml:
-
server:
-
port: 8888
启动工程,发现程序的端口不再是8080,而是8888,表示开发环境配置成功。
六、官方支持默认配置文件属性
七、属性加载优先级
-
1.
@TestPropertySource 注解
-
2. 命令行参数
-
3. Java系统属性(System.getProperties())
-
4. 操作系统环境变量
-
5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource
-
6. 在打包的jar外的应用程序配置文件(application-{profile}.properties,包含YAML和profile变量)
-
7. 在打包的jar内的应用程序配置文件(application-{profile}.properties,包含YAML和profile变量)
-
8. 在
@Configuration类上的
@PropertySource注解
-
9. 默认属性(使用SpringApplication.setDefaultProperties指定)
也就是说比如我配置文件配置了一个name=zhangsan,然后将项目打成jar,运行的时候,如果我们使用 java -jar app.jar --name="Spring"
,那么注入的进去的就是Spring,优先级高
八、配置文件优先级
查看SpringBoot官方文档,可以发现
翻译:
- 当前目录下的一个/config子目录
- 当前目录
- 一个classpath下的/config包
- classpath根路径(root)
也就是说:如果我们有多个配置文件,比如 src/main/resource/application.yml
-
test:
-
user:
-
username : zhangsan
-
age :
18
-
toString: the age of
${test.user.username} is
${test.user.age}
-
-
name: SpringBoot-root
-
-
test2:
${test1}-root
-
-
test3: SpringCloud-root
-
-
server:
-
port:
8080
src/main/resource/config/application.yml
-
test:
-
user:
-
username: lisi-config
-
-
name: SpringBoot-config
-
-
test1:
${name}-config
-
-
test4:
${test3}-config
-
-
server:
-
port:
9090
根据优先级,可以得到能够加载到SpringBoot应用的属性为:
-
test:
-
user:
-
username : lisi
-
age :
18
-
toString: the age
of lisi
is
18
-
-
name: SpringBoot-config
-
test1: SpringBoot-config-config
-
test2: SpringBoot-config-config-root
-
test3: SpringCloud-root
-
test4: SpringCloud-root-config
-
-
server:
-
port:
9090
如果你能够得到上面的结果,表示你已经懂了。
注意优先级高的配置文件中存在和优先级低的配置文件相同属性时,取优先级高配置文件的,不冲突的时候,优先级低的配置文件属性同样会被加载,而不是只加载优先级高的配置文件属性。
九、简单总结
1、普通自定义属性,使用@Value("${xxx}")
注入 2、注入对象,使用@ConfigurationProperties(prefix="test.user")