Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java bean中字段的初始化顺序_Java_Spring_Nullpointerexception_In Class Initialization - Fatal编程技术网

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
,然后继续绑定另一个字段,它移动到instant
two
,然后引起问题。

首先我必须说
字符串2=1.someMethod()这行代码非常糟糕。然后让我解释一下NPE是如何发生的。当Spring实例化bean时,首先它将bean实例化:
A
,然后尝试绑定字段
one
,此时,bean SomeType可能不会实例化,因此Sping会将其标记为
等待到instant
,然后继续绑定另一个字段,它移动到instant
two
,然后导致问题。

您的类
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,但不知何故,所有这些注释都是为了特殊目的,如果必须使用它们,这意味着代码中的某些内容不好。