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

Spring: apply @Autowired to property to eliminate setter

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

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

这是我放入 bean 中的内容 class:

@Autowired
private String message2;

public String getMessage2() {
    return message2;
}

在 xml 文件中:

<bean id="testBean" class="TestBean">
    <property name="message2" value="Hello world!"/>
</bean> 

IDE 抱怨 "can't resolve the property" 编译失败。也许使用带有 xml 配置的 @Autowired 是一种不被允许的奇怪联姻?

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

如果您不想要 setter,则删除 TestBean bean 定义中的 <property> 元素。 property 要求 setter 可用于设置 属性。因为它丢失了,如果你真的尝试加载 XML 配置,例如 ClassPathXmlApplicationContext,你会得到这个错误

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property message2 of bean class [org.example.TestBean]: Bean property message2 is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

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

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

您还需要

<context:annotation-config />

注册处理@AutowiredAutowiredAnnotationBeanPostProcessor


请注意,声明一个 String bean 很尴尬。您最好使用 <property> 或某些 属性 解析机制,从配置文件中提取值并通过 @Value 注释字段分配它。

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