@Value 是在 IOC容器初始化Bean实例化,在属性填充过程中进行赋值的。

@Value 注解可以在任何 Spring 管理的 Bean(如 @Service、@Component、@Controller 等)中生效。只要该类被 Spring 容器管理,@Value 就能自动注入配置值。

@Value 注解可以接收多种类型的参数

  • 基本类型:如 int、long、double、boolean、String 等。
  • 包装类型:如 Integer、Long、Double、Boolean 等。
  • 集合类型:如 List、Set、Map(通常用逗号分隔字符串自动转为集合)。
  • 枚举类型:可自动转换为对应的枚举值。
  • SpEL 表达式:如 @Value("#{2 * 10}")。
  • 配置文件中的占位符:如 @Value("${server.port}")。
  • 嵌套属性:如 @Value("${foo.bar.name}")。
  • 默认值:如 @Value("${foo.bar:defaultValue}")。

使用 @Value 注解时,YAML 列表的格式不被直接支持,最好使用逗号分隔的字符串。如果需要使用列表格式,推荐使用 @ConfigurationProperties,这样可以更方便地处理复杂的配置。

YAML特有格式:数组

names: 
  - 张三
  - 李四

@Value无法使用yaml中的这个数组形式

@Value("${names:王五}")
private String names;

@Confi // todo 待完善!!

@Configuration
@ConfigurationProperties(prefix = "name")
public class FlowEditPermConfig {

    private List<String> name;

    public List<String> getName() {
        return name;
    }

    public void setName(List<String> name) {
        this.name = name;
   

常见错误:使用@Value使用某xx配置,配置文件中不存在,就会出现项目无法启动的异常。为了通用避免,可采用: 冒号的赋值默认值解决。示例

    @Value("${some.type:}")
    private String type;

static修饰符 初始化要早于@value,变量、方法被static修饰,就会导致无法取得配置文件中的预期值。

给static常量注入配置文件值办法

1、setXXX方法追加@Value注解

import org.springframework.beans.factory.annotation.Value;


    // 文件存储目录
    public static String SAVE_PATH;

    
    // 这是一个set方法。添加@Value注解,可对static修饰的属性赋值。
    @Value("${local.file.temp.dir}")
    public void setSavePath(String savePath){
        SAVE_PATH = savePath;
    }

2、@PostConstruct

配置文件Yaml

Message:
  CONFIG_DOMAIN: https://wippe2.cn.dhl.com

使用

    // 定义目标常量
    private static String CURRENT_DOMAIN;

    // 定义中转常量
    @Value("${Message.CONFIG_DOMAIN}")
    public String CONFIG_DOMAIN;
    
    // 给目标常量赋值
    @PostConstruct
    private void initValue(){
        CURRENT_DOMAIN = CONFIG_DOMAIN;
    }

3、implements InitializingBean

public class IndexController implements InitializingBean {

    /**文件存储目录*/
    public static String SAVE_PATH;

    @Value("${local.file.temp.dir}")
    public String SAVE_PATH_TEMP;

    @GetMapping("/test")
    public void test(){
        System.out.println(SAVE_PATH);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        SAVE_PATH = SAVE_PATH_TEMP;
    }
}

@Value配置默认值

使用:隔开

    @Value("${Message.CONFIG_DOMAIN:我是默认值}")
    public String SAVE_PATH_TEMP;

    @Value("${user.male.names:张三,李四}")
    private List<String> userNames;

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤

免责声明:
本站文章旨在总结学习互联网技术过程中的经验与见解。任何人不得将其用于违法或违规活动!所有违规内容均由个人自行承担,与作者无关。