java - Spring bean 已创建,但在 Autowiring 时为空

标签 java spring

我正在尝试将一个对象注入(inject)到一个类中。但是,该字段始终为空。我尝试了 @Autowired@Resource 注释。我不会在任何地方使用 new 运算符创建对象。 Foo 的构造函数被正确调用。

这个问题的最小例子:

Foo 类

package foo.bar;
public class Foo {
    Foo(){
        System.out.println("Foo constructor");
    }
    public void func() {
        System.out.println("func()");
    }
}

酒吧类

package foo.bar;
public class Bar {
    @Autowired
    private Foo foo;

    public Bar() {
        foo.func();
    }
}

入口点

package foo.bar;
public class HelloApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    }
}

spring-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="foo.bar"/>
    <bean id = "foo" class="foo.bar.Foo" />
    <bean id = "bar" class="foo.bar.Bar" />
</beans>

为什么 Bar 类的 foo 字段总是 null?我该如何解决这个问题?

最佳答案

正如@Mick 所指出的,字段注入(inject)必然发生在构造函数完成之后(Spring 没有其他方法可以查看实例并对其进行操作)。修改您的类以使用构造函数注入(inject),您将使您的依赖关系更加明确(例如,因此更易于测试)并消除本质上的竞争条件:

public class Bar {
    private Foo foo;

    @Autowired
    public Bar(Foo foo) {
        this.foo = foo;
        foo.func();
    }
}

关于java - Spring bean 已创建,但在 Autowiring 时为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35846938/

相关文章:

java - spring social 使用 facebook 登录

java - 在 spring 集成中将多个有效负载嵌入到 "Message"对象中的最佳方法是什么?

java - 使用 Spring 配置文件设置系统属性

java - 获取数组中的n个随机元素

java - 为什么 Servlet 的 WEB-INF 文件夹下名为 EmailList.txt 的文件没有打印输出

java - 查找包(又名 java 类的默认范围成员)

java - 在 Spring Boot 应用程序启动后调用方法

java - Double.intValue() 是如何工作的?

java - 使用 SimpleDateFormat 但小时值倒退 3 小时

java - 提交晚上执行的任务