Spring Java config包装注入的地图

时间:2016-12-09 09:08:43

标签: java spring

我最近从使用Spring的XML配置切换到Java配置,并遇到了一个奇怪的问题。

XML配置是:

<util:map id="myMap">
    <entry key="a" value="aValue"/>
    <entry key="b" value="bValue"/>
    <entry key="c" value="cValue"/>
</util:map>

<bean id="myBean" class="my.MyClass">
    <property name="myMap" ref="myMap"/>
</bean>

Java配置是:

@Bean
public Map<String, Object> myMap() {

    Map<String, Object> myMap = new HashMap<>();
    myMap.put("a", "aValue");
    myMap.put("b", "bValue");
    myMap.put("c", "cValue");

    return myMap;
}

@Bean
public MyClass myBean(@Qualifier("myMap") final Map<String, Object> myMap) {

    MyClass myBean = new MyClass();
    myBean.setMyMap(myMap);

    return myBean;
}

两个bean都在不同的文件中声明,我将它们分组在这里以便于阅读。地图也包含引用,而不仅仅是字符串。

我希望能够在第二个bean中使用myMap,但是Spring会注入以下地图:

{ myMap = { a=aValue, b=bValue, c=cValue } }

我不明白为什么Spring将地图包装到另一个地图中,以及为什么它与XML配置的行为方式不同。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

有一个问题@Autowired - 甚至定义了bean名称的地图,因为根据评论你不能使用建议的@Resource注释,所以可以使用定义bean名称的@Value注释:

@Bean
public MyClass myBean(@Value("#{myMap}") final Map<String, Object> myMap) {
//..
}