1

在我发现的所有自动装配示例中,该示例是关于一个<bean> autowire属性,例如设置为byName,并且只有一个应该通过自动装配设置的属性值。

我的问题是,如果<bean>您想通过自动装配设置多个属性怎么办?似乎没有人解释这种情况。有人可以解释我是否可以或是否应该使用autowire在 bean 中设置多个属性?以下是我想通过自动装配设置客户 bean 的帐户和信用属性的这种情况的示例:

<beans>
    <bean name="customer" class="ultratech.com.Customer" autowire="byName">
         <bean name="account"/>
         <bean name="credit>
    </beam>

    <bean name="account" class="ultratech.com.Account"/>
    <bean name="credit" class="ultratech.com.Credit"/>
</beans>

另外,如果我错了,请纠正我,但如果我使用注解(@Autowire),那么我的问题很容易解决,因为我可以单独添加@Autowire到 bean 的任何属性。

4

1 回答 1

2

[编辑:编辑以反映更新的问题]

你的问题现在更清楚了。您似乎认为(如果我正确地遵循您的想法),autowire="byName"您应该提供一个 bean 名称而不是byName值。这是不正确的。autowire 属性可以采用一些可能的值,并且byName是其中之一。当你在这里设置autowire喜欢byName时:

<bean name="someBean" class="foo.bar.Baz" autowire="byName />

然后 Spring 将查看someBean( foo.bar.Bazclass) 中的所有字段,并尝试按名称连接该对象的所有字段。也就是说,(在您的情况下)如果 Customer 类有一个 field account,Spring 将在其上下文中查找并尝试找到一个具有 name 的 beanaccount以注入 Customer bean。

如果你定义了两个这样的 bean:

 <bean name="customer" class="ultratech.com.Customer" autowire="byName" />
 <bean name="account" class="ultratech.com.Account" />

那么你很好,如果 Customer 是这样的类:

public class Customer {
    (...)
    private Account account;
    (...)
}

假设您的 Customer 类具有名为 account 和 credit 的字段,您的 XML 代码片段应该如下所示:

<beans>
    <bean name="customer" class="ultratech.com.Customer" autowire="byName" />
    <bean name="account" class="ultratech.com.Account" />
    <bean name="credit" class="ultratech.com.Credit" />
</beans>

除了“byName”自动装配外,您还可以自动装配:

  1. no - 默认 - 不自动装配
  2. byType - 查找属性类型的 bean - 但要小心 - 只有一个这种类型的 bean 允许自动装配 byType;如果有不止一个,则会引发异常
  3. constructor - 与 byType 一样工作,但仅查找构造函数参数;所有构造函数参数都必须满足每个相应类型的一个 bean

有关更多信息,请参阅 Spring 参考:http: //static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-autowire

于 2013-01-17T16:56:08.340 回答