简单的 autowire="byName" 不起作用

Simple autowire="byName" doesn't work

我有一个带有字段的 POJO message:

package com.packt.lifecycle;

public class HelloWorld {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

在我的应用程序上下文中 XML 我有 2 个 bean 定义:

<bean id="helloWorld" class="com.packt.lifecycle.HelloWorld" autowire="byName">
</bean>

<bean name="message" class="java.lang.String" >
   <constructor-arg value="auto wired1" />
</bean>

但是,由于某些原因,按名称自动装配不起作用。以下代码显示空值:

AbstractApplicationContext  context = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloWorld world = (HelloWorld) context.getBean("helloWorld");
System.out.println(world.getMessage());

只需在您的 bean 定义中添加 属性:

<bean id="helloWorld" class="com.packt.lifecycle.HelloWorld" autowire="byName">
  <property name="message" value="auto wired1" />
</bean>

你不能像那样自动装配字符串。 查看 exceptions for auto-wiring

我认为不鼓励自动连接常量基元,因此它们的创建类似于 属性 值 - 这将迫使您将常量外化到听起来更合适的 属性 文件中。

而是在属性文件中将您的消息定义为:

message.key=Hello World

然后使用 PropertyConfigurer 加载您的属性,然后将常量属性自动装配为 :

@Value("${message.key}")
private String message;

或提供默认值(硬编码)如

@Value("${useDefault:Hello World}")
private String message;

Autowire 不起作用,因为 属性 未在 Spring 中配置。将注解放在字段或方法上,让 Spring 知道此 属性 需要自动装配。

@Component
public class HelloWorld {

    private String message;

    public String getMessage() {
        return message;
    }

    @Autowired
    public void setMessage(String message) {
        System.out.println(message);
        this.message = message;
    }
}

要使注释工作,您需要像

这样的东西
<!--<context:annotation-config/>-->
<context:component-scan base-package="com.packt.lifecycle"/>