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がフィールドの前に初期化され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に注入するとき、SpringはのデフォルトコンストラクターをSomeType呼び出すため、を取得します。ANPE

于 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 に答える