Eventos de contexto do aplicativo Spring
1. Introdução
Neste tutorial, aprenderemos sobre o mecanismo de suporte a eventos fornecido pela estrutura Spring. Exploraremos os vários eventos integrados fornecidos pela estrutura e veremos como consumir um evento.
Para aprender a criar e publicar eventos personalizados, dê uma olhada emour previous tutorial here.
Spring tem um mecanismo de eventos que é construído em torno deApplicationContext. Ele pode ser usado paraexchange information between different beans. Podemos fazer uso de eventos de aplicativo ouvindo eventos e executando código personalizado.
Por exemplo, um cenário aqui seria executar a lógica personalizada na inicialização completa deApplicationContext.
2. Eventos de contexto padrão
Na verdade, há uma variedade de eventos integrados no Spring, quelets a developer hook into the lifecycle of an application and the contexte fazem algumas operações personalizadas.
Embora raramente utilizemos esses eventos manualmente em um aplicativo, a estrutura os utiliza intensamente em si. Vamos começar explorando vários eventos integrados na primavera.
2.1. ContextRefreshedEvent
Eminitializing or refreshing the*ApplicationContext*,, a primavera aumentaContextRefreshedEvent. Normalmente, uma atualização pode ser acionada várias vezes, desde que o contexto não tenha sido fechado.
Observe que também podemos ter o evento disparado manualmente chamando o métodorefresh() na interfaceConfigurableApplicationContext.
2.2. ContextStartedEvent
By calling the start() method emConfigurableApplicationContext,, disparamos este evento e iniciamos oApplicationContext. Por uma questão de fato, o método é normalmente usado para reiniciar beans após uma parada explícita. Também podemos usar o método para lidar com componentes sem configuração para inicialização automática.
Aqui, é importante observar que a chamada parastart() é sempre explícita, ao contrário de refrescar ().
2.3. ContextStoppedEvent
UmContextStoppedEvent é publicadowhen the ApplicationContext is stopped, invocando o métodostop() emConfigurableApplicationContext. Como discutido anteriormente, podemos reiniciar um evento interrompido usando o métodostart().
2.4. ContextClosedEvent
Este evento é publicadowhen the ApplicationContext is closed, usando o métodoclose() emConfigurableApplicationContext. Na verdade, depois de fechar um contexto, não podemos reiniciá-lo.
Um contexto chega ao fim de sua vida ao fechá-lo e, portanto, não podemos reiniciá-lo como em umContextStoppedEvent.
3. @EventListener
Em seguida, vamos explorar como consumir os eventos publicados. A partir da versão 4.2, Spring oferece suporte a um ouvinte de evento orientado por anotações -@EventListener.
Em particular, podemos fazer uso desta anotação paraautomatically register an ApplicationListener based on the signature of the method:
@EventListener
public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) {
System.out.println("Context Start Event received.");
}
Significativamente,@EventListener is a core annotation and hence doesn’t need any extra configuration. Na verdade, o elemento<context:annotation-driven/> existente fornece suporte total para ele.
Um método anotado com@EventListener pode retornar um tipo não vazio. Se o valor retornado não for nulo, o mecanismo de eventos publicará um novo evento para ele.
3.1. Ouvindo vários eventos
Agora, podem surgir situações em que precisaremos que nosso ouvinte consuma vários eventos.
Para tal cenário, podemos fazer uso do atributoclasses:
@EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class })
public void handleMultipleEvents() {
System.out.println("Multi-event listener invoked");
}
4. Application Event Listener
Se estivermos usando versões anteriores do Spring (<4.2), teremos que introduzir umcustom ApplicationEventListener and override the method onApplicationEvent para ouvir um evento.
5. Conclusão
Neste artigo, exploramos os vários eventos integrados na primavera. Além disso, vimos várias maneiras de ouvir os eventos publicados.
Como sempre, os trechos de código usados no artigo podem ser encontradosover on Github.