Весенняя модель, управляемая событиями

Spring

Модель 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. Получите прослушиватель событий от вещателя и выполните метод прослушивания.86441e1d8ffdcce0bb2bb69e81c68426.png

3. Слушатель выполняет метод обратного вызова слушателяc912ac6c8f814541a5316d5fe76cea6c.png

Регистрация вещателей мероприятия

в методе обновления()0ae7861fbfd02e0a34fc57eadb40ceb6.png 31b01bf3db1a652cffce54ebe35ba758.png

Регистрация слушателей событий

в методе обновления()72d5fccac43816ac0cb837e2f63723d6.png

Внедрить слушателей в вещателей3a9d26d2359892ac7490ef81a3f6e573.png 418c4a29eea8851a031a6d0fa306a907.png

Внедрение слушателей в контейнер Spring выполняется средством проверки прослушивателя событий ApplicationListenerDetector, которое реализует BeanPostProcessor.

2fbed39223b07002fa046b1a8b568dd7.png 9884ebf3998a6a23a6545abeca9e6f95.png