Руководство по Spring. Обработка событий.

Spring Event Handling
В предыдущих статьях мы уже видели, что одним из ключевых элементов Spring является ApplicationContext, который управляет жизненным циклом бинов. В процессе своей работы он вызывает целый ряд, так называемых, событий (ContextStoppedEvent, ContextStartedEvent и т.д.)
Обработка этих событий обеспечивается классов ApplicationEvent и интерфейсом ApplicationListener. И когда бин иплементирует интерфейс ApplicationListener, то каждый раз, когда вызывается то или иное событие, бин получает об этом информацию.

Существует целый ряд стандартных событий в Spring Framework:


ContextStartedEvent
Это событие публикуется, когда ApplicationContext запущен через метод start() интерфейса ConfigurableApplicationContext. После получения этого события мы можем выполнить необходимые нам действия (например, записать то-то в базу данных и т.д.).


ContextRefreshedEvent
Это событие публикуется когда ApplicationContext обновлён или инициализирован. Оно может быть вызвано использованием метода refresh() интерфейса ConfigurableApplicationContext.


ContextStoppedEvent
Это событие публикуется, когда ApplicationContext остановлен методом stop() интерфейса ConfigurableApplicationContext. Мы также можем дать команду выполнить определённую работу после получения этого события.


ContextClosedEvent
Публикуется, когда ApplicationContext закрыт методом close() интерфейса ConfigurableApplicationContext. Закрытие контекста – это конец файла. После этого он не может быть перезапущен или обновлен.


RequestHandledEvent
Это специальное событие, которое информирует нас о том, что все бины HTTP-запроса были обслужены (ориентирован на веб).


Обработка событий в Spring однопоточна, а значит, если событие опубликовано, то все процессы будут блокированы, пока все адресаты не получат сообщение. Другими словами, необходимо быть крайне внимательными, когда вы планируете использовать обработку событий в вашем приложении.

Для более глубокого понимания, как это устроено и для чего используется, ниже приведён пример простого приложения.

Пример приложения:
Исходный код проекта можно скачать по ЭТОЙ ССЫЛКЕ.

Структура проекта

eventHandlerStructure

Класс Message.java


package net.proselyte.eventhandling;

import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MessageRunner {
    public static void main(String[] args) {
        ConfigurableApplicationContext context =
                new ClassPathXmlApplicationContext("message-event-handling-config.xml");
        context.start();
        Message message = (Message) context.getBean("message");
        System.out.println(message);
        context.stop();
    }
}

Класс MyStartEventHandler.java


package net.proselyte.eventhandling;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStartedEvent;

public class MyStartEventHander implements ApplicationListener {
    public void onApplicationEvent(ContextStartedEvent event){
        System.out.println("We've received ContextStartedEvent...");
    }
}

Класс MyStopEventHandler.java


package net.proselyte.eventhandling;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextStoppedEvent;

public class MyStopEventHandler implements ApplicationListener {
    public void onApplicationEvent(ContextStoppedEvent event) {
        System.out.println("We've received ContextStoppedEvent...");
    }
}

Конфигурационный файл message-event-handling-config.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="message" class="net.proselyte.eventhandling.Message">
        <property name="message" value="This is simple message."/>
    </bean>
    <bean id="myStartEventHandler"
          class="net.proselyte.eventhandling.MyStartEventHander"/>
    <bean id="myStopEventHandler"
          class="net.proselyte.eventhandling.MyStopEventHandler"/>
</beans>

Результат работы программы

eventHandlerResult

В данной статье мы ознакомились с основами обработки событий с Spring Framework.