I'm new to Spring, I would like to know:
I have a java class annotated with @Component
(spring) and inside I have a method annotated with @PostConstruct
. The class is then referenced by @Autowired
annotated field in another class. Can I assume that the class is only injected after @PostConstruct
is called?
@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");
}
}
If you are asking is injection of given class happening after @PostConstruct
in that bean is called, then the answer is yes - @PostConstruct
is executed before bean is considered as "injectable"
If you are asking if @PostConstruct
on given bean is executed after all injections has been done (on the same bean) - then yes - @PostConstruct
is executed after injections are commited to given bean. This is the reason it exists. Normally you could put @PostConstruct
actions into the constructor. However, when new object is created (constructor is called) injections are not performed yet - so any initialization that depends on injected objects would fail due to NPE. That is why you need @PostConstruct