在SpringBoot配置文件中使用自定义变量
【摘要】 在Springboot项目中,我们常见如下这种yml配置:# 服务端口号,默认80 server: port: 8866 spring: # 服务名称 application: name: springboot-test那么,我们能否定义自己的变量名并在代码中使用呢?答案是肯定的。并且有两种方式:使用@Value注解获取某个值使用@ConfigurationP...
在Springboot项目中,我们常见如下这种yml配置:
# 服务端口号,默认80
server:
port: 8866
spring:
# 服务名称
application:
name: springboot-test
那么,我们能否定义自己的变量名并在代码中使用呢?
答案是肯定的。并且有两种方式:
- 使用@Value注解获取某个值
- 使用@ConfigurationProperties 获取一块值
例如在application.yml中添加如下部分,在程序中要如何获取值呢:
kevinq:
name: kevinq
homepage: https://juejin.cn/user/2928754707141608
list:
- a1
- a2
- a3
使用@Value
使用@Value来获取值,例如:
package com.kevinq.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author kevinq
* 2023/4/12 15:44
* */
@RestController
@RequestMapping("/test")
public class TestController {
@Value("${kevinq.name}")
private String name;
@Value("${kevinq.homepage}")
private String homepageLink;
@RequestMapping("/demo")
public Object demo() {
return name + ": " + homepageLink;
}
}
执行结果:
使用@ConfigurationProperties
有些时候,为了系统更加的具有结构化的美感,我们需要使用此方法。
创建一个类
该类的属性域映射配置文件中的值,注意添加ConfigurationProperties中的prefix值,这样便将该类的对象域与配置文件中值关联起来。
例如:
package com.kevinq.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author kevinq
* 2023/4/12 16:33 */
@Component
@ConfigurationProperties(prefix = "kevinq")
public class KevinQProperties {
private String name;
private String homepage;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHomepage() {
return homepage;
}
public void setHomepage(String homepage) {
this.homepage = homepage;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
需要给该类的各个域定义getter和setter方法。
使用方式:
package com.kevinq.controller;
import com.kevinq.properties.KevinQProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author kevinq
* 2023/4/12 15:44 */@RestController
@RequestMapping("/test")
public class TestController {
@Value("${kevinq.name}")
private String name;
@Value("${kevinq.homepage}")
private String homepageLink;
// 不支持此种方式
// @Value("${kevinq.list}")
// private List<String> list;
@Autowired
private KevinQProperties kevinQProperties;
@RequestMapping("/demo")
public Object demo() {
String result = name + ": " + homepageLink;
return result;
}
@RequestMapping("/demo1")
public Object demo1() {
String result = kevinQProperties.getName() + ": " + kevinQProperties.getHomepage();
result += " ,";
for (String o : kevinQProperties.getList()) {
result += o + ",";
}
return result;
}
}
实现结果:
两者的一点小区别
使用@ConfigurationProperties是支持list属性的,例如:
kevinq:
name: kevinq
homepage: https://juejin.cn/user/2928754707141608
list:
- a1
- a2
- a3
其中的list可以映射到到类的List<String> list
属性上,但是却不能直接使用@Value("${kevinq.list}")
。
如果非要用@Value取值,建议将配置属性上的值改为数组类型,即:
keqinq:
arrayList: a,b,c
则可以使用:
@Value("${keqinq.arrayList}")
String[] arrayList;
总结
总的来说,使用@ConfigurationProperties注解比@Value注解更灵活,适用于需要使用多个变量的场景。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)