likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 39

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

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

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

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

  1. 使用@Value注解获取某个值
  2. 使用@ConfigurationProperties 获取一块值

例如在application.yml中添加如下部分,在程序中要如何获取值呢:

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

执行结果:

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

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

实现结果:

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

两者的一点小区别

使用@ConfigurationProperties是支持list属性的,例如:

其中的list可以映射到到类的List<String> list属性上,但是却不能直接使用@Value("${kevinq.list}")

如果非要用@Value取值,建议将配置属性上的值改为数组类型,即:

keqinq:
	arrayList: a,b,c

则可以使用:

@Value("${keqinq.arrayList}")
String[] arrayList;

总结

总的来说,使用@ConfigurationProperties注解比@Value注解更灵活,适用于需要使用多个变量的场景。