我正在尝试将一个对象注入(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/