bean中字段初始化的顺序



我有一个这样的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,然后导致问题。

相关内容

  • 没有找到相关文章

最新更新