¿Existe alguna característica de Spring 3 para ejecutar algunos métodos cuando la aplicación se inicia por primera vez? Sé que puedo hacer el truco de configurar un método con @Scheduled
anotaciones y se ejecuta justo después del inicio, pero luego se ejecutará periódicamente.
176
Respuestas:
Si por "inicio de la aplicación" te refieres a "inicio del contexto de la aplicación", entonces sí, hay muchas maneras de hacerlo , la más fácil (para los beans singletons, de todos modos) es anotar tu método
@PostConstruct
. Eche un vistazo al enlace para ver las otras opciones, pero en resumen son:@PostConstruct
afterPropertiesSet()
según lo definido por laInitializingBean
interfaz de devolución de llamadaTécnicamente, estos son ganchos en el ciclo de vida del bean , en lugar del ciclo de vida del contexto, pero en el 99% de los casos, los dos son equivalentes.
Si necesita conectarse específicamente al inicio / apagado del contexto, puede implementar la
Lifecycle
interfaz en su lugar, pero probablemente eso sea innecesario.fuente
Access restriction: The type PostConstruct is not accessible due to restriction on required library /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/rt.jar
@PostConstruct
que se llamó su método, pero la infraestructura de JMS de la que dependía indirectamente aún no estaba completamente conectada (y siendo Spring todo simplemente falló en silencio). Al cambiar a@EventListener(ApplicationReadyEvent.class)
todo lo que funcionó (ApplicationReadyEvent
Spring Boot es específico para Vanilla Spring, consulte la respuesta de Stefan).Esto se hace fácilmente con un
ApplicationListener
. Llegué a esto escuchando Spring'sContextRefreshedEvent
:Los escuchas de aplicaciones se ejecutan sincrónicamente en Spring. Si desea asegurarse de que su código se ejecute solo una vez, solo mantenga algún estado en su componente.
ACTUALIZAR
Comenzando con Spring 4.2+ también puede usar la
@EventListener
anotación para observar elContextRefreshedEvent
(gracias a @bphilipnyc por señalar esto):fuente
ContextStartedEvent
, es más difícil agregar el oyente antes de que se active el evento.En Spring 4.2+ ahora puedes simplemente hacer:
fuente
Si está utilizando spring-boot, esta es la mejor respuesta.
Siento que
@PostConstruct
y otras diversas interjecciones del ciclo de vida son formas redondas. Estos pueden conducir directamente a problemas de tiempo de ejecución o causar defectos menos que obvios debido a eventos inesperados del ciclo de vida del bean / contexto. ¿Por qué no invocar directamente su bean utilizando Java simple? Todavía invocas el bean 'spring way' (por ejemplo, a través del proxy AoP de spring). Y lo mejor de todo, es simplemente Java, no puede ser más simple que eso. No hay necesidad de oyentes contextuales o programadores extraños.fuente
main()
, por ejemplo, cuando se usa un marco de aplicación (por ejemplo, JavaServer Faces).Para los usuarios de Java 1.8 que reciben una advertencia cuando intentan hacer referencia a la anotación @PostConstruct, terminé aprovechando la anotación @Scheduled que puede hacer si ya tiene un trabajo @Scheduled con fixedRate o fixedDelay.
fuente
Lo que hemos hecho fue extender
org.springframework.web.context.ContextLoaderListener
para imprimir algo cuando comienza el contexto.Configure la subclase luego en
web.xml
:fuente
Con SpringBoot, podemos ejecutar un método en el inicio mediante
@EventListener
anotacionesfuente
También puede usar un método programado con fixedDelay establecido muy alto
Esto tiene la ventaja de que toda la aplicación está conectada (Transacciones, Dao, ...)
visto en Programación de tareas para ejecutar una vez, usando el espacio de nombres de tareas Spring
fuente
@PostConstruct
?Publicó otra solución que implementa WebApplicationInitializer y se llama mucho antes de que se instale cualquier bean spring, en caso de que alguien tenga ese caso de uso
Inicialice la configuración regional y la zona horaria predeterminadas con la configuración de Spring
fuente
fuente
Si desea configurar un bean antes de que su aplicación se ejecute por completo, puede usar
@Autowired
:fuente
Puede usar
@EventListener
en su componente, que se invocará después de que se inicie el servidor y se inicialicen todos los beans.fuente
Para un archivo
StartupHousekeeper.java
ubicado en el paquetecom.app.startup
,Haz esto en
StartupHousekeeper.java
:Y haz esto en
myDispatcher-servlet.java
:fuente