SpringBoot-Binder的使用

1. 为什么要使用Binder

举个例子,假设Spring的Environment内有以下属性

    public Environment mockEnvironment() {
        
        return new MockEnvironment()
                .withProperty("user.name", "zzzj")
                .withProperty("user.age", "25")
                .withProperty("user.gender", "male")
                .withProperty("user.fullname", "${user.name}1233")
                .withProperty("hobby[0]", "eat")
                .withProperty("hobby[1]", "drink")
                .withProperty("hobby[2]", "play");

    }

以Json的形式表示Environment的属性如下

{
	"user": {
		"name": "zzzj",
		"age": "25",
		"gender": "male",
		"fullname": "${user.name}1233"
	},
	"hobby": [
		"eat",
		"drink",
		"play"
	]
}

那么有这样一个需求

  1. 如何以user为前缀获取一个对象
  2. 如何以hobby为前缀获取一个数组

2. 通过environment的api获取 — 失败

    @Test
    public void getPropertyByEnvironment() {
        
        Environment environment = mockEnvironment();

        // 无法直接获取user
        assertNull(environment.getProperty("user"));

        // 可以通过具体的属性名获取到user.name
        assertEquals("zzzj", environment.getProperty("user.name"));

        // 无法直接获取hobby
        assertNull(environment.getProperty("hobby"));

        // 可以通过具体的属性名获取到hobby的第一项
        assertEquals("eat", environment.getProperty("hobby[0]"));

    }

根据上述代码可知

environment.getProperty只能获取到具体的属性, 而无法通过前缀获取属性集合

3. 通过Binder获取 — 满足需求

    @Test
    public void getPropertyByBinder() throws Exception {

        Binder binder = Binder.get(mockEnvironment());

        // 获取user属性, 作为一个 Map<String, Object>
        BindResult<Map<String, Object>> result = binder.bind("user", Bindable.mapOf(String.class, Object.class));

        assertThat(result.get())
                .hasSize(4)
                .containsEntry("name", "zzzj")
                .containsEntry("age", "25")
                .containsEntry("gender", "male")
                .containsEntry("fullname", "zzzj1233");

        // 获取hobby属性, 作为一个 String[]
        BindResult<String[]> hobby = binder.bind("hobby", Bindable.of(String[].class));

        assertThat(hobby.get())
                .hasSize(3)
                .containsExactly("eat", "drink", "play");

    }

4. @ConfigurationProperties与Binder

在SpringBoot中有一个众所周知的注解@ConfigurationProperties
就是通过Binder来实现的

源码路径
org.springframework.boot.context.properties.ConfigurationPropertiesBinder#bind

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值