Spring:将@Autowired应用于属性以消除setter

时间:2018-02-22 17:02:04

标签: java spring annotations autowired xml-configuration

我对应用于bean属性的@Autowired注释的理解是,通过这样做,我们可以消除setter方法。当我们选择基于注释的配置时,这似乎是有效的:我们只需创建一个使用@Component注释的bean,并将@Autowired注释到其感兴趣的属性。

但是,当我使用基于xml的配置测试这个想法时,我没有做同样的事情。

以下是我在bean类中的内容:

@Autowired
private String message2;

public String getMessage2() {
    return message2;
}

在xml文件中:

<bean id="testBean" class="TestBean">
    <property name="message2" value="Hello world!"/>
</bean> 
IDE抱怨&#34;无法解决财产问题&#34;并且无法编译。也许使用@Autowired和xml配置是一个不允许的奇怪婚姻?

有人愿意帮我解决这个可能很愚蠢的问题吗?

1 个答案:

答案 0 :(得分:0)

如果您不想要setter,那么请删除<property> bean定义中的TestBean元素。 property要求设置器可用于设置属性。因为它缺失了,如果您实际上尝试加载XML配置,例如ClassPathXmlApplicationContext,则会出现此错误

  

引起:org.springframework.beans.NotWritablePropertyException:bean类[message2]的属性org.example.TestBean无效:Bean属性message2不可写或具有无效的setter方法。 setter的参数类型是否与getter的返回类型匹配?

删除<property>后,声明一个适当的bean来注入

<bean id="message2" class="java.lang.String">
  <constructor-arg value="Helllo world!"/>
</bean>

您还需要

<context:annotation-config />

注册处理AutowiredAnnotationBeanPostProcessor处理的@Autowired

请注意,声明String bean很尴尬。使用<property>或某些属性解析机制可以更好地为您提供服务,该机制从配置文件中提取值并通过@Value带注释的字段进行分配。

@Value("${config.message2}")
private String message2;