2017-10-03 4 views
4

私は春のオブジェクトをオートワイヤリングしています。私は同じautowiredオブジェクトを使用してメソッドを呼び出しています。それはNullPointerExceptionをスローしています。問題は、静的ブロック内でメソッドを呼び出すことです。以下は私のコードです -最初に読み込まれるのはどちらですか?静的なブロックか春の豆?

@Autowired 
static MyPropertyManagerClass myPropertyManagerClass; 

private static URL SERVICE_URL = null; 

static { 
    try { 

     SERVICE_URL = myPropertyManagerClass.getServiceURL(); 
    } 
    catch (Exception e) { 
     log.error("Exception Occurred While Invoking myPropertyManagerClass.getServiceURL() : " , e); 
    } 
} 

私が間違っていないのは、静的ブロックが最初に読み込まれるためです。新しいキーワードでオブジェクトを作成せずにこの作業を行う方法はありますか?

+7

@PostConstructを使用してコードを配置します。すべての依存関係が初期化されるとPostConstructが呼び出されます。 – TheLostMind

答えて

2

静的ブロックは、呼び出されます。 コンポーネントの依存関係はまだ初期化されていません。そのため、あなたはNullPointerException(あなたの依存関係はnullです)を取得します。

@PostConstructアノテーションを付けるメソッドにコードを移動し

。これにより、コンポーネントのすべての依存関係が初期化されたときにコードが確実に実行されます。

+0

すべてのBeanが注入された後、または現在のBeanクラスが注入された後に '@ PostConstruct'ブロックが実行されます。言い換えると、私の '@ PostConstruct'を他の非コンポーネントクラス(スプリングでは全くロードされていないクラス)に置くことはできますか? @TheLostMind –

+0

@RishavSharan - PostConstructは、「あなたのコンポーネント」のすべての「依存関係」が初期化された後に実行されます。 PostConstructはJavaの注釈であるため、依存関係注入の後に呼び出される必要があります。クラスが注入するリソースを要求しなくても実行されます。 – TheLostMind

2

スタティックが最初になります。 Spring Beanは、BeanPostProcessor初期化レベルの後に初期化されます。

3

staticブロックは常に春の注射の前に処理されます。 @ TheLostMindのように、"@PostConstructを使用してコードを入力してください"newを避けたい場合は、factory-methodというスプリングをXmlファイルに使用することができます。クラスが初期化されているとき、それがロードされた後

関連する問題