Skip to content
Advertisement

@PostConstruct annotation and spring lifecycle

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");
    }
}

Advertisement

Answer

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

Advertisement