【问题标题】:Injecting a Map into a costructor using annotations使用注解将 Map 注入构造函数
【发布时间】:2013-06-29 05:45:54
【问题描述】:

谁能告诉我如何在不使用 XML 并且只使用注释的情况下将以下构造函数与 Map 对象连接起来?有可能吗?

public class MyClass {
...
    public MyClass (final Map<String, SomeBean> map) {
        this.map = map;
    }
...
}

我想删除的当前 XML:

<bean id="mybean" class="my.package.MyClass">
    <constructor-arg>
        <util:map>
            <entry key="KEY1" value-ref="ref-bean1" />
            <entry key="KEY2" value-ref="ref-bean2" />
        </util:map>
    </constructor-arg>
</bean>

<bean id="ref-bean1" class="my.package.SomeBean">... </bean>

<bean id="ref-bean2" class="my.package.SomeBean">... </bean>

【问题讨论】:

  • 使用@Configuration可以吗?此解决方案只会将 XML 配置移动到 Java 代码。

标签: spring dependency-injection annotations


【解决方案1】:

假设您的 Spring 配置配置为注解配置,您应该能够通过将 MyClass 的构造函数标记为 @Autowired 来消除 myBean 声明。

public class MyClass {
...
    @Autowired
    public MyClass (final Map<String, SomeBean> map) {
        this.map = map;
    }
...
}

Spring 将尝试使用由 bean 名称键入的 SomeBean 实例中的 Map 连接 MyClass 构造函数。

由于配置了单独的 SomeBean 实例(可能具有它们自己的状态),因此您需要将它们保留在 XML 中。

<bean id="KEY1" class="my.package.SomeBean">... </bean>

<bean id="KEY2" class="my.package.SomeBean">... </bean>

另外,正如 LaurentG 所说,总是有@Configuration

【讨论】:

  • 感谢您的建议。实际上,我最终将 2 个 bean 自动装配为 MyClass 的成员,然后在 getMap() 方法中创建了地图。理想情况下,我希望在 MyClass 的默认构造函数中创建此映射,但发现此时尚未连接 2 个 bean(它们为空)。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
相关资源
最近更新 更多