Spring-@Value用法介绍

发布于:2022-08-06 ⋅ 阅读:(979) ⋅ 点赞:(0)

Spring

@Value在开发中最常使用的几个注解之一,通常用来获取配置文件中的属性。

不过除了从配置文件中获取值,@Value还支持使用默认值、表达式等方式为变量设置值。

本文就针对@Value的使用进行分享。

@Value用法

@Value中直接设置值

顾名思义这种方式就是在@Value中为属性赋值,且基本的数据类型都可以通过这种方式赋值。

如下示例为String、int、float、boolean等类型的变量进行了赋值。

@Value("testValue")
private String defaultString;

@Value("123")
private Integer defaultInt;

@Value("123.9")
private Float defaultFloat;

@Value("123333321")
private Long defaultLong;

@Value("true")
private Boolean defaultBoolean;

除了基础类型,对于list类型也可以通过这种方式赋值

@Value("{test:'valueTest'}")
private Map<String, String> defaultMap;
@Value("12,123,321")
private List<Integer> defaultList;

map 应该也可以通过这种方式赋值,但是我通过下边的几种方式赋值都失败了,追了一下源码中的TypeConverterSupport.convertIfNecessary的方法,但是并没有找到类型转换失败的原因。

有知道通过这种方式怎么注入map的同志可以交流下。

@Value("{test:'valueTest'}")
private Map<String, String> defaultMap;
@Value("{test:\"valueTest\"}")
private Map<String, String> defaultMapV2;
@Value("{\"test\":\"valueTest\"}")
private Map<String, String> defaultMapV3;

@Value中使用spel表达式

@Value中使用表达式对属性赋值,需要用到 #{},并且相应的对于基础类型,复杂类型也都可以赋值。

这里比较特殊的是map类型,用表达式 “#{{key:‘testValue’,key2:12344}}” 可以赋值,猜测应该是直接写map的方式无法完成类型转换。

另一个比较特殊的使用方式是最后一个,@Value(“#{readConfigService.testConfigId}”) 这里readConfigService是另一个bean,testConfigId是这个bean里的属性。所以 在进行属性注入的时候,可以注入其他bean中的属性

@Value("#{'sss'}")
private String spelStringValue;
@Value("#{123}")
private Integer spelIntValue;
@Value("#{123.33}")
private Float spelFloatValue;
@Value("#{true}")
private Boolean spelBooleanValue;

@Value("#{'123,1231,123123'.split(',')}")
private List<Integer> spelListValue;

@Value("#{{key:'testValue',key2:12344}}")
private Map<String, Object> spelMapValue;

@Value("#{readConfigService.testConfigId}")
private String spelClazzValue;

@Value中使用$占位符

通过占位符注入配置中的值,需要使用 ${} 也就是我们开发中最常用的方式。

@Value("${value.string}")
private String phStringValue;
@Value("${value.int}")
private String phIntValue;
@Value("${value.float}")
private String phFloatValue;
@Value("${value.boolean}")
private String phBooleanValue;

@Value("${value.list}")
private List<Object> phListValue;
@Value("#{${value.maps}}")
private Map<String, Object> phMapValue;

上边给出了使用占位符注入属性的示例,其中有一点需要注意一下。
map需要和spel表达式结合,才能完成完成注入,即 “#{${value.maps}}” 这种方式,而且在yml配置文件中,也需要注意value前后是需要有 "

value:
  string: 1aass
  int: 123
  float: 123.33
  boolean: true
  maps: "{test1:'value1',test2:'value2',test3:123}"
  list: 123,qwe,asd,231.3

总结

这一篇文章主要是对@Value的不同使用方法进行了介绍,没有过于深入的解析。

本文旨在自我学习记忆,同时让大家知道@Value还有这么多的使用方式。其实这篇文章偏于奇淫巧技的介绍,下次见到类似的使用,我们不发懵就可以咯~~

引用

关于@Value表达式的使用
value注入map
@Value注入map、list

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到