4

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

//DI through annotation
@Inject
private Map<String,CustomerApiLink> apis;

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

能够-> bean ref="ableCustomer";

bravo-> bean ref="bravoCustomer";

charlie-> bean ref="charlieCustomer";

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

4

2 回答 2

3

我已经多次这样做了。我通常@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()在这种情况下,我假设会出现一个名为的方法。

于 2012-11-09T15:46:05.103 回答
0

不需要 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;
于 2012-11-09T15:39:43.420 回答