hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

SpringBoot系列之@Value和@ConfigurationProperties

2019-11-18杂谈搜奇网29°c
A+ A-

继上一篇博客SpringBoot系列之YAML设置用法以后,再写一篇@Value、@ConfigurationProperties的对照博客

这两个主键都是能够猎取设置文件属性的,不过是有比较大的区分的,所以本博客做一下对照,ok,继承拿上一篇博客的例子来试验

## 测试ConfigurationProperties
user:
  userName: root
  isAdmin: true
  regTime: 2019/11/01
  isOnline: 1
  maps: {k1 : v1,k2: v2}
  lists:
   - list1
   - list2
  address:
    tel: 15899988899
    name: 上海市
  • 松懈绑定(Relaxed binding)
    比方例子user: userName也能够示意为user: user-name(大写用-标记),user: username示意为user: user_name(小写用_标记),比方支撑这类写法的就是支撑松懈绑定

例子:
将yml的设置改一下

user:
  user-name: root

先用@ConfigurationProperties测试

package org.muses.jeeplatform.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "user")
public class User {

    private String userName;
    private boolean isAdmin;
    private Date regTime;
    private Long isOnline;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Address address;

    @Override
    public String toString() {
        return "User{" +
                       "userName='" + userName + '\'' +
                       ", isAdmin=" + isAdmin +
                       ", regTime=" + regTime +
                       ", isOnline=" + isOnline +
                       ", maps=" + maps +
                       ", lists=" + lists +
                       ", address=" + address +
                       '}';
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public boolean isAdmin() {
        return isAdmin;
    }

    public void setAdmin(boolean admin) {
        isAdmin = admin;
    }

    public Date getRegTime() {
        return regTime;
    }

    public void setRegTime(Date regTime) {
        this.regTime = regTime;
    }

    public Long getIsOnline() {
        return isOnline;
    }

    public void setIsOnline(Long isOnline) {
        this.isOnline = isOnline;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

Junit测试,能够读到数据

User{userName='root', isAdmin=false, regTime=Fri Nov 01 00:00:00 CST 2019, isOnline=1, maps={k1=v1, k2=v2}, lists=[list1, list2], address=Address{tel='15899988899', name='上海市'}}

改一下,用@Value去读

user:
  userName: root
  is-admin: true
 @Value("${userName}")
    private String userName;
    @Value("${is-Admin}")
    private boolean isAdmin;

ok,发明报错了

org.springframework.beans.TypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'boolean'

ok,本博客例子是用application.yml设置的,关于application.properties的本博客没引见,不过照样要随意提一下,application.properties文件的默许文件编码是utf8,所以写中文时刻有时刻会涌现乱码题目
这时刻能够修正编码:file->settings->Editor->file encodings

  • SpEL表达式
    ok,再对照一下这两种注解对SpEL表达式的支撑,关于SpEL表达式的能够参考:https://blog.csdn.net/fanxiaobin577328725/article/details/68942967

本博客之对照一下,这两种注解

ok,先改下设置,看看@ConfigurationProperties能猎取到?

user:
  isOnline: #{1*1}

debug了一下,发明不能一般盘算
ok,考证@value

@Value("#{1*1}")
    private Long isOnline;

junit测试,ok,@Value是支撑的

User{userName='null', isAdmin=false, regTime=null, isOnline=1, maps=null, lists=null, address=null}
  • JSR303数据校验
    一样关于JSR303本博客也不举行细致引见,概况能够参考博客:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html

@ConfigurationProperties考证:

@AssertTrue
    private boolean isAdmin;

junit测试,发明能够支撑

@Value考证

@AssertTrue
    @Value("${isAdmin}")
    private boolean isAdmin;

考证,校验发明不起效

  • 庞杂范例封装
    ok,考证@Value是不是支撑对象范例和list范例,在上篇博客,很显然考证了@ConfigurationProperties是支撑对象范例和list范例猎取的

所以,本博客考证一下@Value是不是支撑就能够

@Value("${maps}")
    private Map<String,Object> maps;

junit测试,发明范例转换毛病

Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Map';

综上,能够归结一下@Value和@ConfigurationProperties两种属性的区分
| | @ConfigurationProperties| @Value|
|--|--|--|
| 功用对照| 批量注入设置文件属性| 一个一个属性的注入|
| 松懈绑定| 支撑 | 不支撑|
| SpEL| 不支撑 |支撑 |
| JSR303数据校验| 支撑| 不支撑|
| 庞杂范例封装| 支撑 |不支撑 |

所以,@ConfigurationProperties实用与注入设置文件悉数对应bean的悉数属性,而@Value正如其称号一样,合适注入设置文件单个值

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
SpringBoot系列之@Value和@ConfigurationProperties

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282210.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>