简单的autowire =“byName”不起作用

时间:2015-06-27 12:03:56

标签: java spring autowired

我有一个包含字段message的POJO:

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>

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

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

3 个答案:

答案 0 :(得分:2)

你无法像这样自动装配字符串。 查看exceptions for auto-wiring

我认为不鼓励使用常量基元的自动连接,以便它们像属性值一样被创建 - 这将迫使您将常量外部化为属性文件,这听起来更合适。

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

message.key=Hello World

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

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

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

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

答案 1 :(得分:0)

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"/> 

答案 2 :(得分:-1)

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

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