在SpringBoot配置文件中使用自定义变量

举报
KevinQ 发表于 2023/04/19 11:26:41 2023/04/19
【摘要】 在Springboot项目中,我们常见如下这种yml配置:# 服务端口号,默认80 server: port: 8866 spring: # 服务名称 application: name: springboot-test那么,我们能否定义自己的变量名并在代码中使用呢?答案是肯定的。并且有两种方式:使用@Value注解获取某个值使用@ConfigurationP...

在Springboot项目中,我们常见如下这种yml配置:

# 服务端口号,默认80  
server:  
  port: 8866  
spring:  
  # 服务名称  
  application:  
    name: springboot-test

那么,我们能否定义自己的变量名并在代码中使用呢?

答案是肯定的。并且有两种方式:

  1. 使用@Value注解获取某个值
  2. 使用@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;  
    }  
}

执行结果:

Pasted image 20230412163031.png

使用@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;  
    }  
}

实现结果:

Pasted image 20230412172440.png

两者的一点小区别

使用@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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。