Java bean中字段的初始化顺序
我有一个这样的豆子:Java bean中字段的初始化顺序,java,spring,nullpointerexception,in-class-initialization,Java,Spring,Nullpointerexception,In Class Initialization,我有一个这样的豆子: @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-s
@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/>
@组件
@DependsOn(“某种类型”)
甲级{
@自动连线
一型;
字符串2=1.someMethod();
int三;
}
在我的应用程序上下文xml中,我有:
但是,当Spring实例化bean时,它抛出一个
NullPointerException
。因此,我想知道字段two
是否在字段one
之前初始化,从而导致NPE。有人能告诉我bean中的顺序字段是以什么样的方式初始化的吗?首先我必须说stringtwo=one.someMethod()代码>这行代码非常糟糕。然后让我解释一下NPE是如何发生的。当Spring实例化bean时,首先它将bean实例化:A
,然后尝试绑定字段one
,此时,bean SomeType可能不会实例化,因此Sping会将其标记为等待到instant
,然后继续绑定另一个字段,它移动到instanttwo
,然后引起问题。首先我必须说字符串2=1.someMethod()代码>这行代码非常糟糕。然后让我解释一下NPE是如何发生的。当Spring实例化bean时,首先它将bean实例化:A
,然后尝试绑定字段one
,此时,bean SomeType可能不会实例化,因此Sping会将其标记为等待到instant
,然后继续绑定另一个字段,它移动到instanttwo
,然后导致问题。您的类A
声明被编译成以下声明:
class A {
@Autowired
SomeType one;
String two;
int three;
public A() {
this.two = one.someMethod();
}
}
因此,当Spring创建A
的实例以将SomeType
的实例注入其中时,它调用A
的默认构造函数,因此您得到一个NPE
您的类A
声明被编译成这个:
class A {
@Autowired
SomeType one;
String two;
int three;
public A() {
this.two = one.someMethod();
}
}
因此,当Spring创建一个A
的实例来向其中注入SomeType
的实例时,它会调用A
的默认构造函数,从而得到一个NPE
好的,感谢您的响应,您能告诉我如果类中有一个像public(){}这样的无参数构造函数,会发生什么情况吗。还有你用来获取编译版本的工具或东西吗?@maver1k你的代码stringtwo=one.someMethod()
是一个实例变量初始化(),无论是否手动声明,编译器都会将其嵌入构造函数中。您可以使用javap
查看编译器生成的字节码。好的,感谢您的响应,您能告诉我如果类中有一个像public a(){}这样的无参数构造函数,会发生什么情况吗。还有你用来获取编译版本的工具或东西吗?@maver1k你的代码stringtwo=one.someMethod()
是一个实例变量初始化(),无论是否手动声明,编译器都会将其嵌入构造函数中。您可以使用javap
查看编译器生成的字节码。谢谢。但是你说这是一种糟糕的编码实践吗?我还错过了一个重要的部分“DependsOn”。老实说,如果你知道你使用Spring来维护所有的bean,而且Spring也不能保证bean实例化的顺序,那就太糟糕了。这两个配置都是重复的。即使我对其中一个与“DependsOn”相关的bean进行注释,SPring也不能保证顺序?它肯定可以确保首先实例化依赖的bean,但不知何故,所有这些注释都是为了特殊目的,如果您必须使用它们,这意味着代码中有些地方不好。谢谢。但是你说这是一种糟糕的编码实践吗?我还错过了一个重要的部分“DependsOn”。老实说,如果你知道你使用Spring来维护所有的bean,而且Spring也不能保证bean实例化的顺序,那就太糟糕了。这两个配置都是重复的。即使我对其中一个与“DependsOn”相关的bean进行注释,SPring也不能保证顺序?它肯定可以确保首先实例化依赖的bean,但不知何故,所有这些注释都是为了特殊目的,如果必须使用它们,这意味着代码中的某些内容不好。