Spring @PostConstruct vs. init-method attribute

Is there any difference between using the @PostConstruct annotation and declaring the same method as init-method in Spring XML configuration?


Solution 1:

No practically I don't think there is any difference but there are priorities in the way they work. @PostConstruct, init-method are BeanPostProcessors.

  1. @PostConstruct is a JSR-250 annotation while init-method is Spring's way of having an initializing method.
  2. If you have a @PostConstruct method, this will be called first before the initializing methods are called.
  3. If your bean implements InitializingBean and overrides afterPropertiesSet , first @PostConstruct is called, then the afterPropertiesSet and then init-method.

For more info you can check Spring's reference documentation.

Before JSR 250 specs , usage of init-method in xml was preferred way , as it decouples java classes (beans) from any spring specific classes/annotations.So if you are building a library that does not need to be dependent on spring infrastructure beans then use of init-method was preferred.During creation method u can specify the method that needs to be called as initialization method.

Now with introduction of JSR 250 specs in Java EE and spring support of these annotations , dependency on spring framework has been reduced to a certain extent.

But i have to admit that addition of these things increase the readability of code.So there are pros and cons both approaches.

Solution 2:

There's no real difference. It's down to how you prefer to configure your system, and that's a matter of personal choice. Myself, I prefer to use @PostConstruct annotations for my own code (as the bean is only correctly configured after the method is called) and I use init-method when instantiating beans from non-Spring-aware libraries (can't apply annotations there, of course!) but I can totally understand people wanting to do it all one way or the other.