web-dev-qa-db-ja.com

@PostConstructアノテーションとスプリングライフサイクル

私は春に新しいです、私は知りたいです:

Javaクラスに@Component(spring)アノテーションが付けられ、内部に@PostConstructアノテーションが付けられたメソッドがあります。このクラスは、別のクラスの@Autowiredアノテーションフィールドによって参照されます。クラスは@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")

  }

}
14
Daniele

そのBeanの@PostConstructが呼び出された後に発生する特定のクラスの注入を要求している場合、答えはyesです。Beanが「注入可能」と見なされる前に@PostConstructが実行されます

すべてのインジェクションが(同じBeanで)行われた後に、特定のBeanの@PostConstructが実行されるかどうかを尋ねる場合-はい-インジェクションが特定のBeanにコミットされた後に@PostConstructが実行されます。これが存在する理由です。通常、@PostConstructアクションをコンストラクターに入れることができます。ただし、新しいオブジェクトが作成された(コンストラクターが呼び出された)場合、注入はまだ実行されません。したがって、注入されたオブジェクトに依存する初期化はNPEにより失敗します。 @PostConstructが必要な理由です

32
Antoniossss

@PostConstruct@Resource@PreDestroyなどのアノテーションの処理は、この場合BeanPostProcessorを介して行われます CommonAnnotationBeanPostProcessor 。次のSpringの図では、これらのBPPが処理されていることがわかりますafterDependency Injection butbeforeBean Ready For Use(これは注入可能なものを意味します)。

enter image description here

16
Nico Van Belle