私は春に新しいです、私は知りたいです:
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")
}
}
そのBeanの@PostConstruct
が呼び出された後に発生する特定のクラスの注入を要求している場合、答えはyesです。Beanが「注入可能」と見なされる前に@PostConstruct
が実行されます
すべてのインジェクションが(同じBeanで)行われた後に、特定のBeanの@PostConstruct
が実行されるかどうかを尋ねる場合-はい-インジェクションが特定のBeanにコミットされた後に@PostConstruct
が実行されます。これが存在する理由です。通常、@PostConstruct
アクションをコンストラクターに入れることができます。ただし、新しいオブジェクトが作成された(コンストラクターが呼び出された)場合、注入はまだ実行されません。したがって、注入されたオブジェクトに依存する初期化はNPEにより失敗します。 @PostConstruct
が必要な理由です
@PostConstruct
、@Resource
、@PreDestroy
などのアノテーションの処理は、この場合BeanPostProcessorを介して行われます CommonAnnotationBeanPostProcessor 。次のSpringの図では、これらのBPPが処理されていることがわかりますafterDependency Injection butbeforeBean Ready For Use
(これは注入可能なものを意味します)。