0

我有一个这样的豆子:

@Component
@DependsOn("SomeType")
Class A{

@Autowired
SomeType one;

String two = one.someMethod();

int three;

}

In my application context xml, I have:

<bean id="two" class="a.b.c.SomeType"></bean>

<context:component-scan base-package="a.b.c"/>
<context:annotation-config/>

但是当 Spring 实例化 bean 时,它会抛出一个NullPointerException. 所以我想知道该字段two是否在 field 之前初始化one,导致 NPE。谁能告诉我在 bean 中初始化字段的顺序是什么?

4

2 回答 2

3

你的类A声明被编译成这个:

class A {
    @Autowired 
    SomeType one;
    String two;
    int three;

    public A() {
        this.two = one.someMethod();
    }
}

因此,当 Spring 创建一个实例A以将一个实例SomeType注入其中时,它会调用A的默认构造函数,因此您会得到一个NPE.

于 2013-03-26T02:05:48.613 回答
1

首先我不得不说String two = one.someMethod(); 这行代码非常非常糟糕。然后让我解释一下 NPE 是如何发生的。Spring 实例化 bean 时,先实例化 bean: A,然后尝试绑定字段one,此时 bean SomeType 可能没有实例化,所以 Sping 会将其标记为await to instant,然后继续绑定其他字段,它移动到即时two,然后引起问题。

于 2013-03-26T01:54:40.503 回答