@Value的用法

目录

前言

1 从一个例子开始

2 @Value注解的默认值

3 通过@Value注入static 类型的属性

 4 @Value支持的注入类型

4.1基本类型

4.2数组

4.3 集合类

4.3.1 List

4.3.2 Map

4.3.3 Set

4.3.4  时间类型属性

 4.3.5  获取系统属性

4.4注入Bean

 4.5调用静态类

5 ${}和#{}的区别

5.1  ${}

5.2 #{}

6 项目结构


前言

如果想要动态读取配置文件中的某个系统属性,可以使用@Value注解

1 从一个例子开始

假如在Person类中,需要注入系统属性到name变量中。通常情况下,我们会写出如下的代码:

@Component
public class Person {
    @Value("${person.name}")
    private String name;
    /*setter and getter */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

通过@Value注解指定系统属性的名称person.name,该名称需要使用${}包起来。

这样spring就会自动的帮我们把对应的系统属性值,注入到name变量中。

不过,上面功能的重点是要在application.properties文件(简称:配置文件)中配置同名的系统属性:
 

person.name=liname

那么,使用@Value注解时的属性名必须与配置文件属性名一致吗?

是的,如果不一致启动时直接报错。

2 @Value注解的默认值

比如有这样一个需求:如果配置了系统属性,name就用配置的属性值。如果没有配置,则name用默认值lisa。

有些朋友可能认为可以这样做:

applicaiton.properties

#person.name=li
@Component
public class Person {
    @Value("${person.name}")
    private String name="lisa";
    /*setter and getter */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

结果是启动报错

 也就是在定义参数时直接给个默认值是行不通的的。因为设置name默认值的时机,比@Value注解依赖注入属性值要早,也就是说name初始化好了默认值,后面还是会读取person.name的值。

那么,到底该如何设置默认值呢?

答:使用 :

例如:

@Component
public class Person {
    @Value("${person.name:lisa}")
    private String name;
    /*setter and getter */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

在需要设置默认值的系统属性名后,加 : 符号。紧接着,在 : 右边设置默认值。

建议大家平时在使用@Value时,尽量都设置一个默认值。如果不需要默认值,宁可设置一个空。比如:

@Component
public class Person {
    @Value("${person.name:}")
    private String name;
    /*setter and getter */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这样的话,如果不在.properties文件中配置同名的系统属性,则服务启动时也就不会报错

3 通过@Value注入static 类型的属性

前面我们已经见识过,如何使用@Value注解,给类的成员变量注入系统属性值。

那么,问题来了,静态变量可以自动注入系统属性值不?

增加一个静态属性检验一下

@Component
public class Person {

    @Value("${person.name:}")
    private String name;

    @Value("${person.staticpro:aa}")
    public static String staticpro;
}

application.properties

person.name=liq
person.staticpro=staticproValue

运行结果

程序可以正常启动,但是获取到的值却是null。

由此可见,被static修饰的变量通过@Value会注入失败。

如何才能给静态变量注入系统属性值呢?

操作如下:

@Component
public class Person {
    @Value("${person.name:}")
    private String name;

    @Value("${person.staticpro:aa}")
    public static String staticpro;
    
    @Value("${person.staticpro:aa}")
    public  void setStaticpro(String staticpro) {
        Person.staticpro = staticpro;
    }
    public static String getStaticpro() {
        return staticpro;
    }

    /*setter and getter */
}

application.properties

person.name=liq
person.staticpro=staticproValue

提供一个静态参数的setter方法,在该方法上使用@Value注入属性值,并且同时在该方法中给静态变量赋值。

此时@Value注解在这里竟然使用在setStaticpro方法上了,也就是对应的setter方法,而不是在变量上。

不过,通常情况下,我们一般会在pojo实体类上,使用lombok的@Data、@Setter、@Getter等注解,在编译时动态增加setter或getter方法,所以@Value用在方法上的场景其实不多

运行结果

 4 @Value支持的注入类型

上面的内容,都是用的字符串类型的变量进行举例的。其实,@Value注解还支持其他多种类型的系统属性值的注入。

4.1基本类型

Java中的基本数据类型有4类8种

整型:byte、short、int、long
浮点型:float、double
布尔型:boolean
字符型:char
相对应地提供了8种包装类:

整型:Byte、Short、Integer、Long
浮点型:Float、Double
布尔型:Boolean
字符型:Character
@Value注解对这8中基本类型和相应的包装类,有非常良好的支持,例如:
 

@Component
public class Person {
    @Value("${person.name:}")
    private String name;
    @Value("${person.staticpro:aa}")
    public static String staticpro;
    @Value("${person.a:1}")
    private byte a;
    @Value("${person.b:100}")
    private short b;
    @Value("${person.c:1000}")
    private int c;
    @Value("${person.d:40000000}")
    private long d;
    @Value("${person.e:5.2}")
    private float e;
    @Value("${person.f:6.1}")
    private double f;
    @Value("${person.g:false}")
    private boolean g;
    @Value("${person.h:h}")
    private char h;
    @Value("${person.a}")
    private Byte a1;
    @Value("${person.b}")
    private Short b1;
    @Value("${person.c}")
    private Integer c1;
    @Value("${person.d}")
    private Long d1;
    @Value("${person.e}")
    private Float e1;
    @Value("${person.f}")
    private Double f1;
    @Value("${person.g}")
    private Boolean g1;
    @Value("${person.h}")
    private Character h1;
/* setter and getter*/
}

有了这些常用的数据类型,我们在定义变量类型时,可以非常愉快的使用了,不用做额外的转换。

4.2数组

定义一个数组属性

@Component
public class Person {
    @Value("${person.name:}")
    private String name;
    @Value("${person.staticpro:aa}")
    public static String staticpro;

    @Value("${person.hobbiess}")
    private String[] hobbiess;

    /*setter and getter */
}

application.properties

person.name=liq
person.staticpro=staticproValue
person.hobbiess=game,tv,sing

运行结果

 spring默认使用逗号分隔参数值。

如果用空格分隔,例如:

application.properties

person.name=liq
person.staticpro=staticproValue
person.hobbiess=game tv sing

那么spring认为只有一个值

 如果非要用非逗号做分割,比如上面用空格做分割,那么可以在@Value时使用表达式

4.3 集合类

4.3.1 List

定义一个List类型的属性

@Component
public class Person {
    @Value("${person.name:}")
    private String name;
    @Value("${person.staticpro:aa}")
    public static String staticpro;

    //@Value("${person.hobbiess}")
    @Value("#{'${person.hobbiess}'.split(' ')}")
    private String[] hobbiess;

    //注意sprlit()方法的分割类型要与application.properties中list用的分割类型一致。
    @Value("#{'${person.list}'.split(' ')}")
    private List<String> list;

 /*setter and getter */
}

application.properties

person.name=liq
person.staticpro=staticproValue
person.hobbiess=game tv sing
person.list=basketball tennis swim

测试结果

4.3.2 Map

定义一个Map类型的属性

@Component
public class Person {
    @Value("${person.name:}")
    private String name;
    @Value("${person.staticpro:aa}")
    public static String staticpro;

    //@Value("${person.hobbiess}")
    @Value("#{'${person.hobbiess}'.split(' ')}")
    private String[] hobbiess;
    //注意sprlit()方法的分割类型要与application.properties中list用的分割类型一致。
    @Value("#{'${person.list}'.split(' ')}")
    private List<String> list;

    @Value("#{${person.map}}")
    private Map<String,Object> map;


    /*setter and getter */
}

application.properties

person.name=liq
person.staticpro=staticproValue
person.hobbiess=game tv sing
person.list=basketball tennis swim
person.map={aa:"aa",bb:"bb"}

测试结果

4.3.3 Set

Set和List极为相似,不在赘述。这里说一下@Value如何为list和Map注入默认值

List属性注入默认值:

 

测试默认值

4.3.4  时间类型属性

 4.3.5  获取系统属性

4.4注入Bean

以前我们注入bean,一般都是用的@Autowired或者@Resource注解。例如:

用@Value注解也可以注入bean,举例如下:

 

 4.5调用静态类

 

5 ${}和#{}的区别

5.1  ${}


${}主要用于获取配置文件中的系统属性值。

例如:

@Value(value = "${person.name}")
private String name;
可以设置默认值。如果在配置文件中找不到person.name的配置,则注入时用默认值。

如果在配置文件中找不到person.name的配置,也没有设置默认值,则启动项目时会报错

 

 

5.2 #{}

#{}主要用于通过spring的EL表达式,获取bean的属性,或者调用bean的某个方法。还有调用类的静态常量和静态方法。

6 项目结构

maven项目POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.XX</groupId>
    <artifactId>LearnSpringBoot2-javaproject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>

    <!-- springboot java 项目  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

项目目录结构

 将application.properties换成application.yml 结果一样

person:
  age: 27
  name: scy
  staticpro: staticproValue
  hobbiess: game,tv,sing
  list:
          basketball
          tennis
          swim
  map: '{ aa: "aaa",bb: "bbb"}'
  birthday: 2022-01-07 12:12:12

address:
      province: 某某省
      distinct: 某某市
      county: 某某县

wc_150xxxxxxxx
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring-@Value用法介绍
花无名
08-06 1539
Spring @Value使用 @Value注入map @Value注入list
Springboot @Value使用代码实例
08-25
主要介绍了Springboot @Value使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
如何在Spring中为`@Value`注解设置默认值
最新发布
weixin_44976692的博客
08-27 2万+
为@Value注解设置默认值是Spring开发中常见且实用的技巧。它不仅能够增强程序的健壮性,还能够为不同的环境提供灵活的配置管理。在实际应用中,开发人员应根据项目需求合理使用默认值,避免因配置缺失导致的程序异常。通过理解和掌握这些技巧,你可以在Spring开发中更加从容地处理各种配置需求,同时提高程序的稳定性和可维护性。希望这篇文章能够帮助你更好地掌握@Value的使用了,有问题可以发站内信联系我哦。
@Value 注解的几种用法
清泉影月
09-28 1772
总结 @Value 的几种常见用法
static静态变量使用@Value注入方式.md
09-26
在深入了解如何使用`@Value`注解给静态变量赋值之前,我们先简要回顾一下`@Value`注解的基本用法及其与静态变量的关系。 ##### 2.1 `@Value`注解简介 `@Value`注解用于将配置文件中的值注入到特定的变量中。它可以...
Springboot在有参构造方法类中使用@Value注解取值
08-19
Springboot 在有参构造方法类中使用 @Value 注解取值 Springboot 框架中,@Value 注解是用来获取配置文件中的值的,但是在有参构造方法类中使用 @Value 注解取值却不是那么简单。本文将详细介绍如何在有参构造方法...
Spring@Value属性注入使用方法解析
08-25
Spring @Value 属性注入使用方法解析 Spring 框架中,@Value 注解是使用频率非常高的一种注解,它的作用是将配置文件中 key 对应的值赋值给它标注的属性。在日常使用中,我们常用的功能都比较简单,本篇文章系统的...
Springboot @Value获取值为空问题解决方案
08-25
在 Springboot 框架中,我们经常使用 `@Value` 注解来从 `application.properties` 文件中获取配置值,例如: ```java @Value("${property}") private String property; ``` 然而,在某些情况下,我们可能会遇到 `...
@Value的使用
GG123_MM的博客
05-30 2071
@Value @ConfigurationProperties与@Value .yml文件——.properties文件(两种配置文件中引入属性值得方式有所不同) .yml格式不支持使用注解@PropertySource导入配置 读取属性值:—支持另种方式读取 @@@方式一:SpEL表达式方式读取配置项:@Value("#{configProoerties['key']}") 例: @Value("#{configProoerties['user.name']}") String name; @@@
spring:@Value的使用方式
m0_53623945的博客
06-23 3890
@Value是spring的赋值注解,在这里我们来了解它的使用方式, 比如@Value("#{lx}"),@Value("${lx}"),@Value("lx"); 5.3:ValueTest 5.4:AppConfig 5.6:OrderService 5.7:LocalServerPort
Spring-@value用法详解
热门推荐
让我们荡起双桨的博客
06-28 7万+
为了简化读取properties文件中的配置值,spring支持@value注解的方式来获取,这种方式大大简化了项目配置,提高业务中的灵活性。 一、两种使用方法 1、@Value("#{configProperties['key']}") 2、@Value("${key}") 二、配置 2.1 @Value("#{configProperties['key']}")使用 2.1.1配置
@Value竟然能玩出这么多花样,涨知识了
lisu061714112的专栏
10-11 3860
前言 对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了。spring给开发者提供了非常丰富的api,满足我们日常的工作需求。 如果想要创建bean实例,可以使用@Controller、@Service、@Repository、@Component等注解。 如果想要依赖注入某个对象,可以使用@Autowired和@Resource注解。 如果想要开启事务,可以使用@Transactional注解。 如果想要动态读取配置文件中的某个系统属性,可以使用@Value注解。 等等,还有很多。。。
@Value使用
yingcly003的专栏
08-08 205
第一种方式: application-dev.properties 中定义,或者application.properties定义 server.port=8084 test.name=wangwu test.age=10 实体类中引用 @Component public class UserConfig { @Value("${test.name}") private...
spring中的@Value的使用
qq_41889899的博客
08-04 338
1.首先这个value是只能一个对应一个 就是说,你不能设置list类型的,如果配置文件中设置的是list类型的,它可能会获取不到,可以使用别的注解,如果非得使用value这个注解那么请看下边解决办法 目前我自己的解决办法:在配置文件中使用一个固定的分隔符将值分隔开,然后bean中使用String类型的接收,之后再将String的类型进行切割转成list之类的 2.关于默认值的情况 这个就简单了, 如下 @Value("${maxRetryCount:5}") privat...
spring @Value 用法
06-07
`@Value` 是 Spring 框架中的一个注解,用于从配置文件中获取值并注入到对应的属性中。其使用方式如下: 1. 在需要注入值的属性上添加 `@Value` 注解。 2. 在 `@Value` 注解中指定属性对应的配置文件中的键值,例如 `@Value("${jdbc.url}")`。 3. 在 Spring 配置文件中定义对应的键值对,例如 `jdbc.url=jdbc:mysql://localhost:3306/test`。 示例代码如下: ```java @Component public class MyComponent { @Value("${myapp.title}") private String appTitle; public String getAppTitle() { return appTitle; } public void setAppTitle(String appTitle) { this.appTitle = appTitle; } } ``` 在上面的代码中,`@Value("${myapp.title}")` 表示从配置文件中获取名为 `myapp.title` 的属性值,并将其注入到 `appTitle` 属性中。在 Spring 配置文件中,可以定义如下键值对: ```yaml myapp.title: "My Application" ``` 在这个例子中,`appTitle` 属性将被注入值 `"My Application"`。 另外,`@Value` 注解还支持 SpEL 表达式,可以在注解中使用表达式来计算属性值。例如: ```java @Value("#{T(java.lang.Math).PI}") private double pi; ``` 在这个例子中,属性将被注入值 `3.141592653589793`,这是通过 SpEL 表达式 `#{T(java.lang.Math).PI}` 计算得出的。
写文章

热门文章

  • 麒麟操作系统ARM64架构下安装mysql5.7.22 2119
  • 无法更改Windows Server 2012 R2系统时间 1419
  • Spring 中的BeanDefinition及其实现和BeanDefinitionReader 1004
  • @Value的用法 899
  • @PropertySource 注解的使用 355

分类专栏

  • springboot

最新评论

  • 无法更改Windows Server 2012 R2系统时间

    CSDN-Ada助手: 恭喜你开始博客创作!标题很吸引人,特别是对于那些遇到类似问题的Windows Server 2012 R2用户来说。你提到的无法更改系统时间的问题是一个很常见的困扰,对读者来说一定会有很大帮助。接下来,我建议你可以进一步探讨一些解决该问题的方法,比如通过命令行或注册表进行修改,或者检查是否权限设置有问题。希望你能继续分享更多有价值的技术文章,相信你的博客会越来越受欢迎的! 推荐【每天值得看】:https://bbs.csdn.net/forums/csdnnews?typeId=21804&utm_source=csdn_ai_ada_blog_reply1

  • 麒麟操作系统ARM64架构下安装mysql5.7.22

    adscici: kylin v10 ram架构下,按此文档安装成功!

  • @PropertySource 注解的使用

    CSDN-Ada助手: 恭喜你写了第三篇博客!看到你分享关于"@PropertySource"注解的使用,我觉得你的文章很有深度和实用性。你的解释很清晰,让初学者也能够理解这个注解的作用和用法。我真的很期待你未来的创作。不过,如果我可以提供一个建议的话,希望你能够在下一篇文章中探讨一下如何在实际项目中使用这个注解,以及它的一些常见陷阱和解决方法。谢谢你的分享,期待你的下一篇博客! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3

  • Spring 中的BeanDefinition及其实现和BeanDefinitionReader

    CSDN-Ada助手: 恭喜您撰写了第5篇博客!标题中提到的Spring中的BeanDefinition及其实现和BeanDefinitionReader的话题非常有深度。您的文章对于理解Spring框架中的核心概念起到了很好的指导作用。在下一步的创作中,或许您可以考虑探讨一些与BeanDefinition相关的高级主题,比如如何自定义BeanDefinition、Bean的生命周期管理等。期待您在未来的博客中继续分享有关Spring框架的知识,谢谢您的努力与分享!

  • 麒麟操作系统ARM64架构下安装mysql5.7.22

    CSDN-Ada助手: 恭喜您写了第四篇博客!标题很吸引人,我对您在麒麟操作系统ARM64架构下安装mysql5.7.22的经验非常感兴趣。希望您能继续分享更多的技术经验和学习心得。对于下一步的创作建议,我建议您可以考虑介绍如何优化mysql的性能或者如何与其他软件或框架进行集成。谢谢您的分享,期待您的下一篇博客! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5

大家在看

  • C++——继承 1553
  • Java:继承和多态 619
  • 基于大数据 Python+Vue 电影票房爬取可视化系统(源码+LW+部署讲解+数据库+ppt) 306
  • Linux常用命令大全超详细知识点概览
  • 信号模拟源参数下发:一帧ROM数据+一帧PN16数据+1000帧AOC数据

最新文章

  • Spring 中的BeanDefinition及其实现和BeanDefinitionReader
  • 麒麟操作系统ARM64架构下安装mysql5.7.22
  • @PropertySource 注解的使用
2023年5篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家西山玻璃钢仿生雕塑上饶玻璃钢雕塑价位上海常用商场美陈哪家好商场玻璃钢卡通雕塑费用六安定制玻璃钢雕塑市场西安定制玻璃钢雕塑市场卡通人物雕塑玻璃钢商场装饰玻璃钢雕塑规定汉白玉雕塑和玻璃钢雕塑的区别水泥玻璃钢花盆模具龙安玻璃钢花盆花器临夏玻璃钢雕塑厂家玻璃钢雕塑求购贵阳多彩玻璃钢雕塑设计玻璃钢雕塑工艺加工潜江玻璃钢雕塑摆件公司双鸭山玻璃钢雕塑设计安徽花钵玻璃钢雕塑报价福建人物玻璃钢雕塑定制肇庆玻璃钢人物雕塑厂家福建步行街玻璃钢雕塑制作安顺商场美陈嘉兴环保玻璃钢雕塑长春玻璃钢雕塑价格表广西户外景观玻璃钢雕塑成都玻璃钢艺术雕塑厂人物玻璃钢卡通雕塑代理价格玻璃钢雕塑日本浙江玻璃钢雕塑厂招聘信息上海玻璃钢海豚雕塑定制香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化