关于java:spring依赖注入如何工作?

How does spring dependency injection work?

我想知道何时将依赖项注入到SpringBean中。我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class TestClass {

    @Autowired
    Environment env;

    // throws Null Pointer Here.
    String prop = env.getProperty("some.property");

    public void test() {
        // works here
        String prop = env.getProperty("some.property");
    }
}

当我试图获取环境变量时,为什么Spring会抛出NPE。当调用类构造函数时会发生什么?Spring是否只在构建时在上下文中查找bean的可用性,而不在此时何地注入它?请解释一下bean创建的完整流程。依赖项是否只有在对象被构造并添加到上下文之后才被注入?Spring是只在创建类的实例之后才查找依赖项,还是在调用构造函数时查找依赖项?


我建议你自己阅读关于bean生命周期的文章。网上有很多不错的图表,但是……我来帮你处理这个NPE。您要做的是在注入完成之前设置属性。Spring首先对对象进行实例化,然后填充字段,然后进行注入。所以…在初始化env字段之前,您的代码首先创建字段(并尝试使用env字段设置它们)。方法test()是在类对象完全创建之后调用的,因此env字段已经正确准备好使用。

希望有帮助。