扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“如何使用@Value”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
成都创新互联一直通过网站建设和网站营销帮助企业获得更多客户资源。 以"深度挖掘,量身打造,注重实效"的一站式服务,以成都做网站、成都网站建设、成都外贸网站建设、移动互联产品、成都全网营销服务为核心业务。10年网站制作的经验,使用新网站建设技术,全新开发出的标准网站,不但价格便宜而且实用、灵活,特别适合中小公司网站制作。网站管理系统简单易用,维护方便,您可以完全操作网站资料,是中小公司快速网站建设的选择。
目前创新互联公司已为上千余家的企业提供了网站建设、域名、网页空间、网站托管运营、企业网站设计、莎车网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
首先我们创建一个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("${chilx.person.gender:}")private String gender1;// 默认值为null@Value("${chilx.person.nikeName:null}")private String gender2;// 默认值为 男@Value("${chilx.person.password:'男'}")private String gender3;
这个是刚才的问题就迎刃而解了
好了,@Value的基本使用就说完了,你还有什么不明白的吗?
林妹妹:没有了,现在基本的使用我已经明白了
博主:好,那下面我们继续
接下来我们来看下数组类型
配置文件添加一下配置
chilx: person: ....hobbies: 篮球, 足球, 游戏
Person类中添加
@Value("${chilx.person.hobbies}")private String[] hobbies;
然后就可以了,简单吧
林妹妹:嗯嗯,简单简单,套路我都知道了
博主:看把你厉害的,继续继续
接下来我们来学习下集合类型,List和Set使用是一样的,只是Set会去重
继续在application.yaml 中添加配置
chilx: person:....friend: 小明, 小红
林妹妹:我知道一下怎么做了,这不是和Array类型的一样么,谁还不会,不就是在Person类中添加,以下内容不就行了
@Value("${chilx.person.friend}")private Listfriend;
得意的启动项目中… 执行成功
怎么样,我厉害吧
博主:厉害厉害,你也知道当属性不存在的时候直接引用属性是会报错的,集合类型你知道怎么
林妹妹:这个,这个不知道耶(小声)
博主:哈哈哈,看你还得嘚瑟不,这下知道自己的不足了吧
林妹妹:哎呀,不要说我了,快给我讲讲怎么处理呀
博主:好的,好的,这就给你说不要打我了,你要好好看看下面的代码, 大致可以分为以下几种情况
// 默认值 []@Value("${chilx.person.friend1:}")private Listfriend1;// 默认值 [null]@Value("${chilx.person.friend1:null}")private List friend2;// 默认值 [小明,小红]@Value("${chilx.person.friend1:小明,小红}")private List friend3;// 以下是使用的EL表达式// 默认值 []@Value("#{'${chilx.person.friend1:}'.split(',')}")private List friend4;// 默认值 [null]@Value("#{'${chilx.person.friend1:null}'.split(',')}")private List friend5;// 默认值 [小明,小红]@Value("#{'${chilx.person.friend1:小明,小红}'.split(',')}")private List friend6;// 默认值 []@Value("#{'${chilx.person.friend1:,}'.split(',')}")private List friend7;
林妹妹:懂了,懂了原来是这样的。咦,不对呀,Array类型的你怎么没给我讲默认值呀的问题呀
博主:想起来了呀,我以为你忽略了这个问题那
林妹妹::怎么你在怀疑我????
博主:不敢不敢,前面我之所以没说是以为Array,List和Set在默认值方面是一样的,知道了啵
其实集合类型还有其他几种的注入类型的,只是不能使用@Value进行注解
等给你讲完Map类型在给你详细道来
来来咱们继续
接下来咱们来说说字典类型哈
林妹妹:(小声道)不都是一样的套路,谁还不知道
博主当做没听到…
首先在配置文件中添加配置
chilx: person: .....pet: "{'小狗':'旺旺', '小猫':'喵喵'}"courses: "{'语文':100, '数学':99}"
java类中添加对应的属性,注意@Value中要使用EL表达式
@Value("#{${chilx.person.pet}}")private Mappet;@Value("#{${chilx.person.courses}}")private Map courses;
这样就可以了是不是很简单
林妹妹:嗯呐
同理咱们来说下Map的默认值
// 默认值 null@Value("#{${chilx.person.courses1:{}}}")private Mapcourses1;// 默认值 null@Value("#{${chilx.person.courses1:null}}")private Map courses2;// 默认值 {k1:v1}@Value("#{${chilx.person.courses1:{k1:'v1'}}}")private Map courses3;
可以看到,默认值的设置都大同小异
字典类型和集合类型一样,也是有其他的配置方式的,只是也是不支持@Value的注入方式,休息下我们继续哈
春去秋来,一晃眼十… 咳咳扯远了,继续继续
前面咱们不是讲过集合类型和字典类型还有其他的的注入方式呀,现在咱们趁热打铁学习一下
咱们现在使用的方式是批量绑定配置文件中的属性
pom.xml中添加相关依赖
org.springframework.boot spring-boot-configuration-processor true
新创建一个类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 Listfriend;private List pet1;private List pet2;private List pet3;private Map 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”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流