Spring @Value如何通过${}、#{}注入不同类型的值

 更新时间:2024年05月31日 08:44:32   作者:少爷晚安。  
这篇文章主要介绍了Spring @Value如何通过${}、#{}注入不同类型的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring @Value通过${}、#{}注入不同类型值

@Value有两种注入方式

  • @Value("${}"):自定义参数获取,获取对应属性文件(yml或properties文件)中自定义的属性
  • @Value("#{}"):SpEL表达式,获取Bean的某个属性或调用其某个方法,还可以表示常量

"${}"可以设置默认值,当从配置文件中获取不到时,若没有设置默认值,则会抛异常。

//在指定的配置路径后面加冒号,在冒号后面给定默认值
@Value("${constants.test:hello}")

注意:

${}和#{}可以嵌套使用,但必须#{}外面,${}在里面,先会执行${},因为spring执行${}的时机要早于#{}。

不同类型注入

yml配置文件:

constants:
  test:
    string: test
    integer: 3
    list: a,b,c
    other: a.b.c
    map: "{key1:'var1', key2:'var2'}"

ps:以下所有类型注入都参考如上配置文件!!!

String

@Value("${constants.test.string:test}")
private String value;

@Value("#{'test'}")
private String value;

Integer

@Value("${constants.test.integer:3}")
private Integer value;

@Value("#{3}")
private Integer value;

List

@Value("${constants.test.list:var1,var2,var3}")
private List<String> sList;

上面这种方式只能使用,逗号隔开,其他字符不会分割,不然会看成是一个整体的字符串

@Value("#{'${constants.test.other}'.split('.')}")
private List<String> sList;

#{}${}嵌套使用,其中${constants.test.other}是一个String类型的Bean,split方法是用来分割字符串,.为指定的分割符,当然也可以换成其他字符,但一定要和${constants.test.other}配置的一致

Map

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

注意上面的map解析中,一定要用"双引号把map所对应的constants.test.map的值包起来,要不然解析会失败,导致不能转成 Map。

异常信息:

Could not resolve placeholder 'constants.test.map' in value "#{${constants.test.map}}"

指定类型的Bean

@Configuration
public class Config {
	@Bean("myRestTemplate")
	public RestTemplate restTemplate() {
		return new RestTemplateBuilder().build();
	}
}
@Value("#{myRestTemplate}")
private RestTemplate restTemplate;

静态属性赋值

spring 不允许/不支持把值注入到静态变量。

@Value("${constants.test.string}")
private static String value;

如上操作,最后变量value的结果是等于null值。

解决方法:

spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量。

private static String value;

@Value("${constants.test.string}")
public void setValue(String value) {
	this.value = value;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Logback配置文件这么写(TPS提高10倍)

    Logback配置文件这么写(TPS提高10倍)

    这篇文章主要介绍了Logback配置文件这么写(TPS提高10倍),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java中Spring的Security使用详解

    Java中Spring的Security使用详解

    这篇文章主要介绍了Java中Spring的Security使用详解,在web应用开发中,安全无疑是十分重要的,选择Spring Security来保护web应用是一个非常好的选择,需要的朋友可以参考下
    2023-07-07
  • JAVA日常开发中读写XML的方法详解

    JAVA日常开发中读写XML的方法详解

    这篇文章主要介绍了JAVA日常开发中读写XML的相关资料,详细讲解了在Java中如何使用DOM(文档对象模型)和SAX(简单API for XML)两种方式读取XML文件,以及如何使用DOM和JAXB(Java Architecture for XML Binding)两种方式写入XML文件,需要的朋友可以参考下
    2024-12-12
  • Spring Boot 分库分表策略示例展示

    Spring Boot 分库分表策略示例展示

    分库分表是为了应对大规模数据和高并发请求,提高系统的性能和可扩展性,以下是如何在 Spring Boot 中实现分库分表的详细策略,感兴趣的朋友一起看看吧
    2024-08-08
  • httpclient getPoolEntryBlocking连接池方法源码解读

    httpclient getPoolEntryBlocking连接池方法源码解读

    这篇文章主要为大家介绍了httpclient getPoolEntryBlocking连接池方法源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Java concurrency之Condition条件_动力节点Java学院整理

    Java concurrency之Condition条件_动力节点Java学院整理

    Condition的作用是对锁进行更精确的控制。下面通过本文给大家分享Java concurrency之Condition条件的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-06-06
  • Gradle 6.6.1 安装配置的详细教程

    Gradle 6.6.1 安装配置的详细教程

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。这篇文章主要介绍了Gradle 6.6.1 安装配置的详细教程,需要的朋友可以参考下
    2020-09-09
  • Java的动态代理模式之Cglib代理详解

    Java的动态代理模式之Cglib代理详解

    这篇文章主要介绍了Java的动态代理模式之Cglib代理详解,Cglib代理也叫作 子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理,需要的朋友可以参考下
    2023-11-11
  • java webservice上传下载文件代码分享

    java webservice上传下载文件代码分享

    这篇文章主要为大家详细介绍了java webservice上传下载文件代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 如何通过XML方式配置并实现Mybatis

    如何通过XML方式配置并实现Mybatis

    这篇文章主要介绍了如何通过XML方式配置并实现Mybatis,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论