Spring自动装配Map,List等集合@ConfigurationProperties

这个特性的其实还得归纳到@Autowired的特性上,或者说@Autowired包涵了一些我们不知道的能力。
@Autowired
private Map<String, BaseValidateCodeGenerator> baseValidateCodeGenerators;
在Spring中,写这种形式的代码,spring能自动装配值到map中,这种装配不是简单的给Map赋值,而是往Map里塞入元素,塞入规则需要看源码。我们平时可以适当利用这种特性来简化业务代码的编写。具体实现方式在DefaultListableBeanFactory#doResolveDependency()中。总结来说规则就是:
1、如果是数组,则获取数组元素类型,查找匹配该类型的所有bean,返回一个这些bean的数组;
2、如果该类可赋给Collection,并且是一个接口,则获取集合元素类型,查找匹配该类型的所有bean,返回一个这些bean的集合;
3、如果该类型是Map(注意是type == Map.class),且key是String类型,则获取Map的value的类型,查找匹配该类型的所有bean,这是一个key为bean name、value为bean实例的一个Map,返回这个Map。
4、其他情况则是我们所熟知的按类型自动装配过程。

一、使用@ConfigurationProperties

如果配置文件是这样的:

api:
  a:
    in:
      publicKey: ipk1
      privateKey: isk1
    out:
      publicKey: opk1
      privateKey: osk1
  b:
    in:
      publicKey: ipk2
      privateKey: isk2
    out:
      publicKey: opk2
      privateKey: osk2

SpringBoot配置文件的特点是key=value形式,但是允许层级嵌套,嵌套以后,情况就变复杂了。

以上面配置为例:最外层的key肯定是一个变量,名字就是api,api的类型是什么,取决于api下面的配置项,我们可以看到,a,b,c......很明显在随业务增多而变化,所以这个层级需要一个Map,紧接着in、out这个层级,这些key都是固定的了,此时就知道这些是变量名称了。具体类型如下:

@Component
@ConfigurationProperties
@Data
public class TestProperties {

    Map<String, AllKey> api;

    @Data
    public static class AllKey {
        private Key in;
        private Key out;
    }

    @Data
    public static class Key {
        private String publicKey;
        private String privateKey;

    }

}

这样配置就自动注入进去了。这就是约定的巨大作用。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring properties自动装配可以方便地将Map<String, List>类型的属性注入到Spring容器中的Bean中。在Spring中,可以使用@ConfigurationProperties注解来进行自动装配。 首先,我们需要在配置类中使用@ConfigurationProperties注解,并指定prefix属性为属性的前缀。假设我们的属性前缀是"my",那么配置类中的代码如下: ```java @Configuration @ConfigurationProperties(prefix = "my") public class MyConfig { private Map<String, List<String>> myMap; public Map<String, List<String>> getMyMap() { return myMap; } public void setMyMap(Map<String, List<String>> myMap) { this.myMap = myMap; } } ``` 接下来,在配置文件中,我们可以使用以下方式将属性注入到配置类中: ```properties my.myMap.key1=value1,value2,value3 my.myMap.key2=value4,value5 ``` 通过以上配置,Spring会将属性值自动注入到MyConfig类的myMap属性中,并将属性key1对应的值作为List<String>类型的value1、value2、value3注入到Map中,将key2对应的值作为List<String>类型的value4、value5注入到Map中。 我们可以在其他需要使用这些属性的Bean中,将MyConfig类作为依赖注入进来,并通过调用getMyMap()方法来获取属性值。例如: ```java @Service public class MyService { private Map<String, List<String>> myMap; public MyService(MyConfig myConfig) { this.myMap = myConfig.getMyMap(); } // 其他业务逻辑方法 } ``` 通过以上方式,我们可以方便地在Spring中实现Map<String, List>类型的属性自动装配。这样的方式可以减少硬编码,并且灵活性较高,便于维护和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值