【问题标题】:Spring Java config wraps injected mapSpring Java 配置包装注入的地图
【发布时间】:2017-04-24 17:11:49
【问题描述】:

我最近从使用 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 配置的行为方式不同。

有什么想法吗?

【问题讨论】:

  • 也许像这里所说的那样使用@Resource:stackoverflow.com/questions/13913752/…?
  • 不幸的是我不能使用@Resource 解决方案,因为这些bean 位于不同的文件/不同的模块中。如果我使用@Resource,我最终会在模块的上下文之间形成一个循环引用循环。

标签: java spring


【解决方案1】:

有一个问题@Autowired-ing 映射甚至定义了 bean 名称,因为根据 cmets,您不能使用建议的 @Resource 注释,因此可以使用 @Value 注释定义豆名:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多