Spring:如何通过自动装配设置多个属性?

时间:2013-01-17 16:47:07

标签: java spring properties autowired

在我找到的所有自动装配示例中,示例是关于一个<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添加到任何豆的属性。

1 个答案:

答案 0 :(得分:2)

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

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

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

然后Spring将查看someBeanfoo.bar.Baz类)中的所有字段,并尝试按名称连接此对象的所有字段。也就是说,(在您的情况下)如果Customer类具有字段account,Spring将查看其上下文并尝试查找名为account的bean以注入Customer bean。

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

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

那么如果客户是这样一个班级,那么你很高兴:

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

以下是您的XML代码段应该是什么样的,假设您的Customer类具有名为account和credit的字段:

<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. 构造函数 - 与byType类似,但只查找构造函数参数;所有构造函数参数必须满足每个相应类型的一个bean
  4. 有关详细信息,请参阅Spring参考: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-autowire