¿Hay alguna diferencia entre usar la @PostConstructanotación y declarar el mismo método que init-methoden 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-methodson BeanPostProcessors.
@PostConstructes una anotación JSR-250 mientras que init-methodes la forma en que Spring tiene un método de inicialización.@PostConstructmétodo, se llamará primero antes de llamar a los métodos de inicialización.afterPropertiesSet, primero @PostConstructse llama, luego afterPropertiesSety 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
@PostConstructanotaciones 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-methodal 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:
@PostConstructse llamará.InitializingBeanse implementa, entoncesafterPropertiesSet()se llamará.init-methodo@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
@PostConstructyinit-methodporque@PostConstructse maneja en lapostProcessAfterInitializationfase de inicialización del frijol (AbstractAutowireCapableBeanFactory.initializeBean()método) porCommonAnnotationBeanPostProcessor, mientras queinitel método es llamado después de la finalización de lapostProcessBeforeInitializationfase (y, por este asunto, antes del comienzo depostProcessAfterInitializationla fase).EDITAR : Entonces, la secuencia es: 1)
postProcessBeforeInitializationfase, 2)initse llama al método, 3)postProcessAfterInitializationfase, que llama al@PostConstructmétodo(Como nota al margen, una declaración de la respuesta aceptada
no es del todo correcto:
@PostConstructes manejado por aBeanPostProcessor, elinitmé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 supostProcessBeforeInitializationmétodo.No hay ninguna diferencia con la configuración predeterminada de Spring
BeanPostProcessorsporque todos losBeanPostProcessorsque están configurados para ejecutarse despuésCommonAnnotationBeanPostProcessor, no hacen nada en elpostProcessBeforeInitializationmé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