¿Hay alguna diferencia entre usar la @PostConstruct
anotación y declarar el mismo método que init-method
en la configuración de Spring XML?
No, prácticamente no creo que haya ninguna diferencia, pero hay prioridades en la forma en que funcionan. @PostConstruct
, init-method
son BeanPostProcessors.
@PostConstruct
es una anotación JSR-250 mientras que init-method
es la forma en que Spring tiene un método de inicialización.@PostConstruct
método, se llamará primero antes de llamar a los métodos de inicialización.afterPropertiesSet
, primero @PostConstruct
se llama, luego afterPropertiesSet
y luego init-method
.Para obtener más información, puede consultar la documentación de referencia de Spring .
Antes de las especificaciones JSR 250, el uso del método init en xml era la forma preferida, ya que desacopla las clases Java (beans) de cualquier clase / anotaciones específicas de Spring. Entonces, si está construyendo una biblioteca que no necesita depender de los beans de infraestructura de Spring luego se prefirió el uso del método init.Durante el método de creación, puede especificar el método que debe llamarse como método de inicialización.
Ahora, con la introducción de las especificaciones JSR 250 en Java EE y el soporte de primavera de estas anotaciones, la dependencia del marco de primavera se ha reducido hasta cierto punto.
Pero tengo que admitir que la adición de estas cosas aumenta la legibilidad del código, por lo que existen ventajas y desventajas en ambos enfoques.
No hay ninguna diferencia real. Depende de cómo prefiera configurar su sistema, y eso es una cuestión de elección personal. Yo mismo, prefiero usar
@PostConstruct
anotaciones para mi propio código (ya que el bean solo está configurado correctamente después de que se llama al método) y lo usoinit-method
al crear instancias de beans de bibliotecas que no son compatibles con Spring (¡no se pueden aplicar anotaciones allí, por supuesto!) pero puedo entender totalmente que la gente quiera hacerlo todo de una forma u otra.fuente
@postconstruct no es parte de la primavera. Es parte del paquete javax. Ambos son iguales. usando el método init debemos agregarlo en el archivo xml. Si usa @postconstruct, no es necesario agregar en xml. Consulte el artículo a continuación.
http://answersz.com/spring-postconstruct-and-predestroy/
fuente
Como puede ver en el siguiente diagrama de devolución de llamada del ciclo de vida de la creación de Bean .
Este 3 paso ocurre en la devolución de llamada del ciclo de vida de la creación de Bean:
@PostConstruct
se llamará.InitializingBean
se implementa, entoncesafterPropertiesSet()
se llamará.init-method
o@Bean(initmethod="..")
entonces llama al método init.Este diagrama es de Pro Spring 5: una guía detallada del marco de Spring y sus herramientas
fuente
No puede haber diferencia entre
@PostConstruct
yinit-method
porque@PostConstruct
se maneja en lapostProcessAfterInitialization
fase de inicialización del frijol (AbstractAutowireCapableBeanFactory.initializeBean()
método) porCommonAnnotationBeanPostProcessor
, mientras queinit
el método es llamado después de la finalización de lapostProcessBeforeInitialization
fase (y, por este asunto, antes del comienzo depostProcessAfterInitialization
la fase).EDITAR : Entonces, la secuencia es: 1)
postProcessBeforeInitialization
fase, 2)init
se llama al método, 3)postProcessAfterInitialization
fase, que llama al@PostConstruct
método(Como nota al margen, una declaración de la respuesta aceptada
no es del todo correcto:
@PostConstruct
es manejado por aBeanPostProcessor
, elinit
método no lo es.)Habrá una diferencia si alguno (potencialmente personalizado)
BeanPostProcessor
, que está configurado con (Ordered.getOrder()
) para ejecutarse despuésCommonAnnotationBeanPostProcessor
, está haciendo algo serio en supostProcessBeforeInitialization
método.No hay ninguna diferencia con la configuración predeterminada de Spring
BeanPostProcessors
porque todos losBeanPostProcessors
que están configurados para ejecutarse despuésCommonAnnotationBeanPostProcessor
, no hacen nada en elpostProcessBeforeInitialization
método.En conclusión, la respuesta aceptada y similares son correctas ... en el 99% de los casos, y esta publicación es solo para rendir homenaje a un concepto "el diablo está en los detalles"
fuente
Código completo aquí: https://github.com/wkaczurba/so8519187 ( spring-boot )
Usando anotaciones:
Nos consigue:
fuente