Модель Spring, управляемая событиями, включает три понятия: события, прослушиватели событий и издатели событий.
Механизм событий обеспечивает поддержку обмена сообщениями между компонентами.
событие ApplicationEvent
public abstract class ApplicationEvent extends EventObject {
private final long timestamp;
// protected transient Object source; 父类中定义
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}
}
При настройке событий вам нужно только наследовать ApplicationEvent
Прослушиватель событий ApplicationListener
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
void onApplicationEvent(E event);
}
Интерфейс ApplicationListener определяет подкласс ApplicationEvent как параметр метода в интерфейсе, поэтому каждый прослушиватель отслеживает определенное событие.
Пользовательским прослушивателям событий нужно только реализовать интерфейс ApplicationListener.
Приложение Event PublisherEventPublisher
@FunctionalInterface
public interface ApplicationEventPublisher {
default void publishEvent(ApplicationEvent event){
publishEvent((Object) event);
}
void publishEvent(Object event);
}
ApplicationContext реализует ApplicationEventPublisher, поэтому события можно публиковать напрямую через ApplicationContext.
Функции
- Событие может обрабатываться несколькими слушателями
- Если в методе публикации событий есть транзакция, методы публикации событий и прослушивания событий находятся в одной транзакции, которая относится к синхронной обработке.
- Вы можете добавить аннотацию @Async к onApplicationEvent, чтобы обработка стала асинхронной.
Аннотация @EventListener
Вы можете использовать аннотацию @EventListener в методе слушателя вместо реализации интерфейса ApplicationListener, и вы можете добавить аннотацию @Order к методу для реализации порядка обработки слушателя.
@TransactionalEventListener изолирует транзакцию публикации и прослушивания событий.
Пример
@Data
public class HomeWorkEvent extends ApplicationEvent {
/**
* 作业内容
*/
private String content;
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public HomeWorkEvent(Object source, String content) {
super(source);
this.content = content;
}
}
/**
* 定义作业的监听者学生
* @author xup
* @date 2019/12/28 21:57
*/
@Component
public class StudentListener implements ApplicationListener<HomeWorkEvent> {
@Override
public void onApplicationEvent(HomeWorkEvent event) {
System.out.println("StudentListener接收到老师布置的作业:" + event.getContent());
}
}
/**
* 作业发布者--教师
* @author xup
* @date 2019/12/28 21:59
*/
@Component
public class TeacherPublisher {
@Autowired
private ApplicationContext applicationContext;
public void publishHomeWork(String content){
HomeWorkEvent homeWorkEvent = new HomeWorkEvent(this, content);
applicationContext.publishEvent(homeWorkEvent);
}
}
/**
* 定义作业的监听者学生
* @author xup
* @date 2019/12/28 21:57
*/
@Component
public class StudentListener2 {
@EventListener
@Order(2)
public void receiveHomeWork(HomeWorkEvent event) {
System.out.println("StudentListener2接收到老师布置的作业2:" + event.getContent());
}
@EventListener(classes = {HomeWorkEvent.class})
@Order(1)
public void receiveHomeWork(Object event) {
System.out.println("StudentListener2接收到老师布置的作业1:" + ((HomeWorkEvent)event).getContent());
}
}
@RunWith(value= SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TeacherPublisherTest {
@Autowired
private TeacherPublisher teacherPublisher;
@Test
public void publish(){
teacherPublisher.publishHomeWork("背诵课文。。");
}
}
输出
StudentListener2接收到老师布置的作业1:背诵课文。。
StudentListener2接收到老师布置的作业2:背诵课文。。
StudentListener接收到老师布置的作业:背诵课文。。
принцип
выпуск события
1. Получите средство вещания событий (ApplicationEventMulticaster) для публикации событий.
2. Получите прослушиватель событий от вещателя и выполните метод прослушивания.
3. Слушатель выполняет метод обратного вызова слушателя
Регистрация вещателей мероприятия
в методе обновления()
Регистрация слушателей событий
в методе обновления()
Внедрить слушателей в вещателей
Внедрение слушателей в контейнер Spring выполняется средством проверки прослушивателя событий ApplicationListenerDetector, которое реализует BeanPostProcessor.