我对应用于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配置是一个不允许的奇怪婚姻?
有人愿意帮我解决这个可能很愚蠢的问题吗?
答案 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;