我有一个这样的bean:
@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
是否在字段one
之前初始化,导致NPE。谁能告诉我在bean中字段是按什么顺序初始化的?
你的类A
声明被编译成这样:
class A {
@Autowired
SomeType one;
String two;
int three;
public A() {
this.two = one.someMethod();
}
}
因此,当Spring创建A
的实例以注入SomeType
的实例时,它调用A
的默认构造函数,因此您得到NPE
。
首先我不得不说String two = one.someMethod();
这行代码非常非常糟糕。那么让我来解释一下NPE是如何发生的。当Spring实例化bean时,首先它实例化bean: A
,然后尝试绑定字段one
,此时,bean SomeType可能不会被实例化,因此Spring将其标记为await to instant
,然后继续绑定另一个字段,它移动到实例化的two
,然后导致问题。