Spring Autowire属性对象

时间:2013-03-22 17:19:06

标签: java spring autowired

我已成功为除java.util.Properties实例之外的所有内容配置了Spring自动装配。

当我使用注释自动装配其他所有内容时:

@Autowired private SomeObject someObject;

它运作得很好。

但是当我尝试这个时:

@Autowired private Properties messages;

使用此配置:

<bean id="mybean" class="com.foo.MyBean" >
  <property name="messages">
    <util:properties location="classpath:messages.properties"/>
  </property>
</bean>

我收到错误(仅限相关行):

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mybean' defined in class path resource [application.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'messages' of bean class [com.foo.MyBean]: Bean property 'messages' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

Wheras,如果我用一种老式的setter方法尝试它,Spring非常高兴地连接它:

public void setMessages(Properties p) {   //this works
  this.messages = p;
}

尝试自动装配属性对象时,我做错了什么?

1 个答案:

答案 0 :(得分:8)

看起来你正试图在第一种情况下调用setter方法。在bean元素中创建一个property元素时,它将使用setter注入来注入bean。 (你的情况下没有一个setter,所以它会抛出一个错误)

如果你想要自动装配它,请删除它:

<property name="messages">
    <util:properties location="classpath:messages.properties"/>
</property>

从bean定义中,这将尝试调用setMessages方法。

而是简单地将上下文文件中的属性bean分别定义到MyBean

<bean id="mybean" class="com.foo.MyBean" />
<util:properties location="classpath:messages.properties"/>

然后应该正确地自动装配。

请注意,这也意味着您可以将此@Autowired private Properties messages;添加到任何Spring托管bean,以便在其他类中使用相同的属性对象。