【问题标题】:Overriding key strings of an @autowired/@Inject Map<String,Object>?覆盖@autowired/@Inject Map<String,Object> 的键字符串?
【发布时间】:2012-11-09 15:36:35
【问题描述】:

我有几个 CustomerApiLink 类型的 Spring bean,假设这些 bean 的名称分别是“ableCustomer”、“bravoCustomer”和“charlieCustomer”(这只是一个示例)。现在我通过

将它们全部注入地图
//DI through annotation
@Inject
private Map<String,CustomerApiLink> apis;

但我发现默认情况下 Spring IoC 容器总是使用它们的名称作为映射键,我想覆盖它,以获得以下映射:

able-> bean ref="ableCustomer";

bravo-> bean ref="bravoCustomer";

charlie-> bean ref="charlieCustomer";

是否可以通过注释来做到这一点?或者我必须在 xml 文件中创建另一个 util bean?

【问题讨论】:

    标签: java spring map dependency-injection inversion-of-control


    【解决方案1】:

    我已经多次这样做了。我通常将 @Inject 一个 Set 我想要的对象的构造函数或设置器,并在那时创建一个 Map

    public class MyObject {
        private Map<String, CustomerApiLink> apiLinks;
    
        @Inject
        public MyObject(Set<CustomerApiLink> apis) {
            apiLinks = new HashMap<String, CustomerApiLink>();
            for(CustomerApiLink api : apis) {
                apiLinks.put(api.getName(), api);
            }
        }
    }
    

    当然,对于这个解决方案,它需要一种从CustomerApiLink 对象中获取密钥的方法。在这种情况下,我假设会出现一个名为 getName() 的方法。

    【讨论】:

      【解决方案2】:

      不需要 XML,但您可以注释 setter 方法而不是字段,并在方法中自己处理提供的映射。

      @Inject
      public void setApis(Map<String,CustomerApiLink> apis){
          this.apis = new HashMap<String,CustomerApiLink>();
          // now copy values from the incoming map to your internal map
          // using keys of your own choice
      }
      private Map<String,CustomerApiLink> apis;
      

      【讨论】:

        猜你喜欢
        • 2016-11-16
        • 2021-04-29
        • 2020-12-26
        • 2018-09-22
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        相关资源
        最近更新 更多