Código Fuente: Ejemplo 16
Para la programación orientada a eventos Spring provee las siguientes clases:
ApplicationEvent
Es cualquier tipo de evento, normalmente se extiende esta clase para definir los eventos específicos de la aplicación que se esté desarrollando.
ApplicationListener
Cualquier bean que desee ser notificado de un evento tiene que implementar esta interface.
Soporta el uso de "generics" de tal manera que podemos usar lo siguiente: ApplicationListener<EventoEspecifico> para ser notificados sólo cuando el evento "EventoEspecifico" sea lanzado. Si no se usa esto se notificará cada vez que se lance cualquier evento.
ApplicationEventPublisher
Es la clase necesaria para publicar los eventos.
Veamos el siguiente ejemplo:
Problema
Se desea que cada vez que la velocidad del carro supere un máximo el sistema de seguridad del carro active los frenos.
Solución
Se va a usar las siguientes clases:
CambioDeVelocidadEvento
Es el evento que se disparará cada vez que haya un cambio de velocidad.
public class CambioDeVelocidadEvento extends ApplicationEvent {
int velocidad = 0;
public CambioDeVelocidadEvento(Acelerador source) {
super(source);
velocidad = source.getVelocidadActual();
}
Acelerador
Esta clase es la que realiza el cambio de velocidades. Como se ve en el siguiente código; cada vez que se cambia la velocidad se publica el evento “CambioDeVelocidadEvento”
@Component
public class Acelerador {
int velocidadActual = 0;
@Autowired
ApplicationEventPublisher applicationEventPublisher;
public void setearVelocidad(int velocidad){
this.velocidadActual = velocidad;
applicationEventPublisher.publishEvent(new CambioDeVelocidadEvento(this));
}
Freno
Es la clase que se encargará de disminuir la velocidad del carro.
@Component
public class Freno {
public void frenar(){
System.out.println("Frenando...");
}
SistemaDeSeguridad
Esta clase implemente el “ApplicationListener” y lo tipifica con “CambioDeVelocidadEvento” de tal manera que este listener sólo será notificado cuando haya eventos de este tipo.
El método del listener es: “onApplicationEvent” ahí vemos que se verifica la velocidad actual y en base a eso se decide si frenar o no.
@Component
public class SistemaDeSeguridad implements ApplicationListener<CambioDeVelocidadEvento> {
private static final int VELOCIDAD_SEGURA_MAXIMA = 150;
@Autowired
Freno freno;
public void onApplicationEvent(CambioDeVelocidadEvento cambioDeVelocidadEvento) {
int velocidadActual = cambioDeVelocidadEvento.getVelocidad();
if (velocidadActual > VELOCIDAD_SEGURA_MAXIMA) {
System.out.println("La velocidad segura fue superada:" + velocidadActual);
freno.frenar();
} else {
System.out.println("Velocidad segura:" + velocidadActual);
}
}
A tener en Cuenta
Si queremos ser notificados de todos los eventos se debe implementar “ApplicationListener” sin usar “generics”. Como en el siguiente ejemplo:
@Component
public class AplicacionListener implements ApplicationListener{
public void onApplicationEvent(ApplicationEvent applicationEvent) {
if (applicationEvent instanceof ContextRefreshedEvent){
System.out.println("El ApplicationContext fue inicializado o refrescado");
}else if (applicationEvent instanceof ContextClosedEvent){
System.out.println("El ApplicationContext fue cerrado");
}else if (applicationEvent instanceof ContextStartedEvent){
System.out.println("El ApplicationContext fue inicializado");
}else if (applicationEvent instanceof ContextStoppedEvent){
System.out.println("El ApplicationContext fue detenido");
}else{
System.out.println("Otro evento fue lanzado:" + applicationEvent);
}
}
