温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用@Value

发布时间:2021-10-14 10:21:35 来源:亿速云 阅读:112 作者:iii 栏目:编程语言

本篇内容介绍了“如何使用@Value”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1、String类型

首先我们创建一个spring boot项目,不会的可以看下博主的另一篇文章idea创建Springboot 2.X项目

然后在application.yaml中配置如下内容

chilx:
  person:name: chilxage: 18

接着我们就是可以使用这两个参数了

创建个一个Person类,使用就可以使用@Value注解了

@Value("${chilx.person.name}")private String name;@Value("${chilx.person.age}")private Integer age;

林妹妹:好的那我试下

过了一会--------

林妹妹:不对呀我这里项目报错呀

博主:我看看,(瞟了一眼后)你呀你真是个小笨蛋,你看看错误提示,你使用的没有声明的参数

这一点我忘了和你说当我们使用@Value引用没有声明的参数时会报报错的哦

例如 gender 这个属性在配置文件中没有声明,我们在Perso类中添加一下内容

@Value("${chilx.person.gender}")private String gender;

启动项目会报以下的错误

如何使用@Value

林妹妹:那有没有解决的方法呀?

当然是有的呀,我们在引用属性的时候可以给一个默认值,当属性不存在的时候就赋值其默认值

我们改造下刚才的内容,在引用参数的后面加上冒号和默认值就可以了

// 默认值为空串@Value("${chilx.person.gender:}")private String gender1;// 默认值为null@Value("${chilx.person.nikeName:null}")private String gender2;// 默认值为 男@Value("${chilx.person.password:'男'}")private String gender3;

这个是刚才的问题就迎刃而解了

好了,@Value的基本使用就说完了,你还有什么不明白的吗?

林妹妹:没有了,现在基本的使用我已经明白了

博主:好,那下面我们继续

2、Array类型

接下来我们来看下数组类型

配置文件添加一下配置

chilx:
  person:
 		....hobbies: 篮球, 足球, 游戏

Person类中添加

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

然后就可以了,简单吧

林妹妹:嗯嗯,简单简单,套路我都知道了

博主:看把你厉害的,继续继续

3、List/Set集合类型

接下来我们来学习下集合类型,List和Set使用是一样的,只是Set会去重

继续在application.yaml 中添加配置

chilx:
  person:....friend: 小明, 小红

林妹妹:我知道一下怎么做了,这不是和Array类型的一样么,谁还不会,不就是在Person类中添加,以下内容不就行了

@Value("${chilx.person.friend}")private List<String> friend;

得意的启动项目中… 执行成功

怎么样,我厉害吧

博主:厉害厉害,你也知道当属性不存在的时候直接引用属性是会报错的,集合类型你知道怎么

林妹妹:这个,这个不知道耶(小声)

博主:哈哈哈,看你还得嘚瑟不,这下知道自己的不足了吧

林妹妹:哎呀,不要说我了,快给我讲讲怎么处理呀

博主:好的,好的,这就给你说不要打我了,你要好好看看下面的代码, 大致可以分为以下几种情况

// 默认值 []@Value("${chilx.person.friend1:}")private List<String> friend1;// 默认值 [null]@Value("${chilx.person.friend1:null}")private List<String> friend2;// 默认值 [小明,小红]@Value("${chilx.person.friend1:小明,小红}")private List<String> friend3;// 以下是使用的EL表达式// 默认值 []@Value("#{'${chilx.person.friend1:}'.split(',')}")private List<String> friend4;// 默认值 [null]@Value("#{'${chilx.person.friend1:null}'.split(',')}")private List<String> friend5;// 默认值 [小明,小红]@Value("#{'${chilx.person.friend1:小明,小红}'.split(',')}")private List<String> friend6;// 默认值 []@Value("#{'${chilx.person.friend1:,}'.split(',')}")private List<String> friend7;

林妹妹:懂了,懂了原来是这样的。咦,不对呀,Array类型的你怎么没给我讲默认值呀的问题呀

博主:想起来了呀,我以为你忽略了这个问题那

林妹妹::怎么你在怀疑我????

博主:不敢不敢,前面我之所以没说是以为Array,List和Set在默认值方面是一样的,知道了啵

其实集合类型还有其他几种的注入类型的,只是不能使用@Value进行注解

等给你讲完Map类型在给你详细道来

来来咱们继续

4、 Map类型

接下来咱们来说说字典类型哈

林妹妹:(小声道)不都是一样的套路,谁还不知道

博主当做没听到…

首先在配置文件中添加配置

chilx:
  person:
 		.....pet: "{'小狗':'旺旺', '小猫':'喵喵'}"courses: "{'语文':100, '数学':99}"

java类中添加对应的属性,注意@Value中要使用EL表达式

@Value("#{${chilx.person.pet}}")private Map<String, String> pet;@Value("#{${chilx.person.courses}}")private Map<String, String> courses;

这样就可以了是不是很简单

林妹妹:嗯呐

同理咱们来说下Map的默认值

// 默认值 null@Value("#{${chilx.person.courses1:{}}}")private Map<String, String> courses1;// 默认值 null@Value("#{${chilx.person.courses1:null}}")private Map<String, String> courses2;// 默认值 {k1:v1}@Value("#{${chilx.person.courses1:{k1:'v1'}}}")private Map<String, String> courses3;

可以看到,默认值的设置都大同小异

字典类型和集合类型一样,也是有其他的配置方式的,只是也是不支持@Value的注入方式,休息下我们继续哈

春去秋来,一晃眼十… 咳咳扯远了,继续继续

5、ConfigurationProperties

前面咱们不是讲过集合类型和字典类型还有其他的的注入方式呀,现在咱们趁热打铁学习一下

咱们现在使用的方式是批量绑定配置文件中的属性

  • pom.xml中添加相关依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional></dependency>
  • 新创建一个类User

    添加对应的类注解,prefix属性对应的是配置文件中的配置的层级,一直到倒数第二级

@ConfigurationProperties(prefix = "chilx.girlfriend")
  • 编写配置文件

chilx:
  girlfriend: name: 林妹妹     age: 18 hobbies: 唱歌, 跳舞     friend:  迎春, 惜春     pet1: 大象, 狮子     pet2:   - 老虎       - 豹子     pet3:   小猫
       小狗     courses:   k1: 100   k2: 100
  • 编写User类

注意:类中的属性要和配置文件中的最后一级的配置名称要一致,强一致,切记切记。如果对应的配置不存在,则属性为null

User类的具体如下

@Component@Getter@Setter@ToString@ConfigurationProperties(prefix = "chilx.girlfriend")public class User {   private String name;private Integer age;/** * 默认值为空串 */private String gender;/** * 不存在为null */private String nikeName;/** * 默认值为 男 */private String password;private String[] hobbies;private List<String> friend;private List<String> pet1;private List<String> pet2;private List<String> pet3;private Map<String, Integer> courses;

做完上面几步就对属性绑定完成了,是不是简单

林妹妹:是挺简单,感觉比@Value方便多了,可以一次批量绑定,就是没有@Value灵活

博主:鱼和熊掌不可兼得耶

ConfigurationProperties不仅可以绑定属性连对象都可以绑定,我给你演示下

  • 在配置文件中添加以下配置

chilx:
  girlfriend:
		 .....     boyfriend: {   name: chilx, age: 18 }
  • 在User类中添加对应属性

private Boyfriend boyfriend;

以上两步就解决了,是不是很简单,是不是很简单

@Value和ConfigurationProperties的却别

  • @Value属性填充是在bean实例化后调用populateBean(),由AutowiredAnnotationBeanPostProcessor注入填充

  • @ConfigurationProperties的属性填充,是在initializeBean时, 由ConfigurationPropertiesBindingPostProcessor注入填充

结论:如果一个字段同时被两种方式进行填充,最终填充是由@ConfigurationProperties决定

“如何使用@Value”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI