2017-06-21 20 views
5

私は春に新たなんだ、私は知っているしたいと思います:@PostConstruct注釈と春のライフサイクル

私は@Component(春)で注釈されたJavaクラスを持っていると私は@PostConstructアノテーションを付けるメソッドを持っているの内側。クラスは、別のクラスの@Autowired注釈付きフィールドによって参照されます。 @PostConstructが呼び出された後にクラスが注入されるだけであると仮定できますか?あなたが求めている場合、Beanが

「注射用」と見なされる前に@PostConstructが実行される -

@Component 
class AuthenticationMetrics { 

    private static final MetricRegistry metrics = new MetricRegistry(); 

    final Counter requestsTotal 

    final Meter guestLogins 

    final Meter kfUserLogins 

    final Timer guestLoginResponseTime 

    final Timer kfLoginResponseTime 

    @PostConstruct 
    public void populateMetricsRegistry() { 

    metrics.counter("authentication.requests.totals") 

    } 

} 
+1

はいyuoはそれを取ることができる...春は、まず、最終的@PostConstructアノテーションをチェックし、最後にBeanを注入し、Beanを作成します。いずれにしても、populateMetricsRegistryメソッドで非スプリングオブジェクトを使用していることがわかります。この場合、このオブジェクト(メトリックオブジェクト)では、正しいライフサイクルを管理するのが自分の責任です。 –

+0

私は_anotherクラスについて混乱しています_。あなたの 'AuthenticationMetrics'クラスがインスタンス化され、そのフィールドが注入されます(このサンプルではnone)、' @ PostConstruct'が呼び出されます。 'AuthenticationMetrics'をどこかに注入している場合は、' @ PostConstrtuct'が呼び出される前に注入されます。 –

答えて

7

あなたが求めている場合は、そのBeanで@PostConstruct後に起こって与えられたクラスの注入は、その後、答えはイエスである、と呼ばれています指定されたbeanの@PostConstructがすべての注入が完了した後(同じbean上で)実行されている場合、 - yes - @PostConstructは、指定されたbeanに注入がコミットされた後に実行されます。これが存在する理由です。通常は、@PostConstructアクションをコンストラクタに入れることができます。ただし、新しいオブジェクトが作成されると(コンストラクタが呼び出されたとき)、まだ注入が実行されないため、注入されたオブジェクトに依存する初期化はNPEによって失敗します。あなたは@PostConstruct

+1

こんにちは、私は@PostConstructが "注射可能"とみなされる前に@PostConstructが実行されているかどうかを尋ねています。ありがとう! – Daniele

+0

この部分を削除することができます: "@PostConstructの実行がBeanがどこかに注入されていることを意味するかどうかを尋ねる場合は - ノー"私は答えを受け入れる。 – Daniele

3

など@PostConstruct@Resource@PreDestroyなどの注釈の処理が、この場合CommonAnnotationBeanPostProcessorには、BeanPostProcessorを介して行われる必要がある理由です。これらのBPPは、従属性注入の後にの後に処理されますが、の前にの前に処理されます(これは、注入可能な分量を意味します)。

enter image description here