如何在构造函数上使用@Autowired DI自动装配没有定义bean的属性?

时间:2012-10-10 04:43:40

标签: java spring dependency-injection annotations

我有一个EquityOrder类,包含Equity列表和String作为其属性。还定义了方法“placeOrder”。我已经自动装配了我的构造函数,并且已经在我的XML文件中定义了Equity的bean。

@Autowired
public EquityOrder(String name, List<Equity> equity) {
    this.name = name;
    this.equity = equity;
}

public void placeOrder() {

    for (Equity eq : equity)
        System.out.println("Placing order for " + eq.getSecurityName()
                + "with quantity " + eq.getQuantity());
}

在xml我有下面的场景,这是没有错误的。

<context:annotation-config />
<bean name="testEquity" class="com.sapient.Spring.Equity.Equity">

    <property name="symbol" value="MSFT"></property>
    <property name="securityName" value="Microsoft"></property>
    <property name="type" value="IT"></property>
    <property name="quantity" value="100"></property>

</bean>

<bean name="testOtherEquity" class="com.sapient.Spring.Equity.Equity">

    <constructor-arg value="GOOG">
    </constructor-arg>
    <constructor-arg value="Google"></constructor-arg>
    <constructor-arg value="IT"></constructor-arg>
    <constructor-arg value="100"></constructor-arg>

</bean>

<bean name="testEquityOrder" class="com.sapient.Spring.Equity.EquityOrder">
</bean>

问题 - 在构造函数中我没有String,那么项目运行正常。但是如果构造函数中包含String,则抛出异常为 -

Error creating bean with name 'testEquityOrder' defined in class path resource 
[SpringConfig.xml]: Unsatisfied dependency expressed through constructor argument with 
index 0 of type [java.lang.String]: : No matching bean of type [java.lang.String] found
for dependency: expected at least 1 bean which qualifies as autowire candidate for this
dependency. Dependency annotations: {}; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of 
type [java.lang.String] found for dependency: expected at least 1 bean which qualifies
as autowire candidate for this dependency. Dependency annotations: {}

这意味着容器正在寻找String bean但它不能存在。如何解决这个问题。一种方法是在setter上使用注释。但是如何使用Constructor上的@Autowire注释呢?感谢

1 个答案:

答案 0 :(得分:2)

您可以使用<constructor-arg>元素为name属性提供值,如下所示:

<bean name="testEquityOrder" class="com.sapient.Spring.Equity.EquityOrder">
    <constructor-arg value="dummyValue" />
</bean>

另一个构造函数参数无论如何都被自动装配,因为它已经定义了一个bean。

P.S。此外,我必须说EquityOrder似乎是一个数据对象,除非它是一些配置数据,否则它不应该像这样注入/自动装配,如果它取决于用户输入。