美文网首页
【Spring boot】 @Value注解

【Spring boot】 @Value注解

作者: HeloWxl | 来源:发表于2023-04-10 16:56 被阅读0次

    一、不通过配置文件的注入属性

    1.1 注入普通字符串

    直接附在属性名上,在 Bean 初始化时,会赋初始值

    @Value("normal")
    private String normal; 
    

    1.2 注入java系统变量

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName; // 注入操作系统属性
    

    1.3 注入表达式结果

    #{ }里面写表 SpEL 达式

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入表达式结果
    

    1.4 将配置文件 *.properties 或 *. yml 里 配置的 属性 注入

    yml配置如下

    book:
      name: live
    
    @Value("${book.name}")
    private String bookName;
    

    1.5 注入文件资源

    @Value("classpath:com/hry/spring/configinject/config.txt")
    private Resource resourceFile; // 注入文件资源
    

    1.6 注入url资源

    @Value("http://www.baidu.com")
    private Resource testUrl; // 注入URL资源
    

    二、通过配置文件的注入属性

    Springboot通过@Value注解将配置文件中的属性注入到容器内组件中
    (可用在@Controller、@Service、@Configuration、@Component等Spring托管的类中)

    2.1 普通字符串注入

    例:yml中存在key:

    name: zs
    

    @Value注入

    @Value("${name}")
    public String name;
    

    注:当yml中的name没有对应值时,此时,字符串name的值为""
    设置注入属性的默认值(当配置文件中没有此key时,此默认值生效),语法:

    // 此时,若配置文件中没有name这个key,变量name的值为zch
    @Value("${name:zch}")
    public String name;
    

    2.2 常用的int、boolean类型

    yml 配置文件

    port: 8888
    flag: true
    

    Java代码

    @Value("${port}")
    public int port;
    
    @Value("${flag}")
    public boolean flag;
    

    2.3 数组类型

    yml 配置文件

    id: 1,2,3
    

    Java代码

    @Value("${id}")
    public int[] idArray;
    

    2.4 list类型

    示例1

    yml 配置文件

    id: 1,2,3
    

    Java代码

    @Value("#{'${id}'.split(',')}")
    public List<String> idList;
    

    注意:当yml中id没有对应值时,集合idList长度为1,存在值"" (原本以为是空集合,造成bug,特记录)

    解决办法

    在 split() 之前判断下是否为空即可

    @Value("#{'${id:}'.empty ? null : '${id:}'.split(',')}")  
    private List<String> idList;  
    

    示例2

    test:
      ids:
        - 1
        - 2
        - 3
    

    对于 .properties文件配置如下所以:

    test.ids[0]=1
    test.ids[1]=2
    test.ids[2]=3
    

    如果通过@Value注解获取如下所示:

    @Value("${test.ids}")  
    private List<String> ids;  
    

    你会发现程序直接报错了,报错信息如下:

    java.lang.IllegalArgumentException: Could not resolve placeholder 'test.ids' in value "${test.ids}"  
    

    解决办法

    新建一个配置类:

    @Data
    @Configuration
    @ConfigurationProperties("test")
    public class GetListConfig {
        private List<String> ids;
    }
    

    通过注入的方式使用,即可;

    2.5 map类型

    user: "{name: 'zs',age: '23'}" #注意此值用双引号包裹
    

    Java代码

    @Value("#{${user}}")
    public Map<String,String> userInfo;
    

    注意: 当yml中user没有对应值时,启动报错

    相关文章

      网友评论

          本文标题:【Spring boot】 @Value注解

          本文链接:https://www.haomeiwen.com/subject/lrlwddtx.html