AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Spring事件機(jī)制,深入剖析,提升你的技術(shù)水平!

來源: 責(zé)編: 時(shí)間:2023-11-01 09:18:38 227觀看
導(dǎo)讀環(huán)境:Spring5.3.231. 簡介Spring事件機(jī)制是一種用于處理系統(tǒng)內(nèi)部或者外部事件的機(jī)制,它是Spring框架的一部分。事件機(jī)制基于監(jiān)聽者設(shè)計(jì)模式實(shí)現(xiàn),包括事件、發(fā)布器和監(jiān)聽器三個(gè)主要部分。在Spring中,事件是主體,發(fā)布器負(fù)責(zé)

環(huán)境:Spring5.3.235j928資訊網(wǎng)——每日最新資訊28at.com

1. 簡介

Spring事件機(jī)制是一種用于處理系統(tǒng)內(nèi)部或者外部事件的機(jī)制,它是Spring框架的一部分。事件機(jī)制基于監(jiān)聽者設(shè)計(jì)模式實(shí)現(xiàn),包括事件、發(fā)布器和監(jiān)聽器三個(gè)主要部分。5j928資訊網(wǎng)——每日最新資訊28at.com

在Spring中,事件是主體,發(fā)布器負(fù)責(zé)發(fā)布事件,監(jiān)聽器負(fù)責(zé)處理事件。事件對象封裝了事件源對象和事件相關(guān)信息,用于在事件源和監(jiān)聽器之間傳遞信息。發(fā)布器通過注入事件發(fā)布者實(shí)現(xiàn),使用事件發(fā)布者發(fā)布事件。監(jiān)聽器通過實(shí)現(xiàn)ApplicationListener接口來定義,用于對事件進(jìn)行處理。5j928資訊網(wǎng)——每日最新資訊28at.com

Spring容器提供了事件管理機(jī)制,內(nèi)部很多節(jié)點(diǎn)都會發(fā)布事件,也支持自定義事件。在Spring Boot中,你可以使用ApplicationEventPublisher接口來發(fā)布事件,通過繼承ApplicationEvent抽象類來定義事件對象,通過實(shí)現(xiàn)ApplicationListener接口來定義事件監(jiān)聽器。5j928資訊網(wǎng)——每日最新資訊28at.com

總之,Spring事件機(jī)制是一個(gè)非常有用的工具,可以幫助你更好地管理和處理系統(tǒng)中的事件。5j928資訊網(wǎng)——每日最新資訊28at.com

2. 事件發(fā)布及監(jiān)聽

創(chuàng)建并發(fā)布自己的自定義事件。通過ApplicationEvent5j928資訊網(wǎng)——每日最新資訊28at.com

static class OrderEvent extends ApplicationEvent {  private Order order ;  public OrderEvent(Object source, Order order) {    super(source) ;    this.order = order ;  }  public Order getOrder() {    return this.order;  }}

要接收自定義 ApplicationEvent,可以創(chuàng)建一個(gè)實(shí)現(xiàn) ApplicationListener 的類,并將其注冊為 Spring Bean。5j928資訊網(wǎng)——每日最新資訊28at.com

static class OrderListener implements ApplicationListener<OrderEvent> {  @Override  public void onApplicationEvent(OrderEvent event) {    System.out.printf("監(jiān)聽到定義事件:%s", event.getOrder().toString()) ;  }}

要發(fā)布自定義 ApplicationEvent,調(diào)用 ApplicationEventPublisher 上的 publishEvent() 方法。通常,可以通過創(chuàng)建一個(gè)實(shí)現(xiàn) ApplicationEventPublisherAware 的類并將其注冊為 Spring Bean 來實(shí)現(xiàn):5j928資訊網(wǎng)——每日最新資訊28at.com

static class OrderService implements ApplicationEventPublisherAware {  private ApplicationEventPublisher eventPublisher ;  @Override  public void setApplicationEventPublisher(ApplicationEventPublisher eventPublisher) {    this.eventPublisher = eventPublisher ;  }  public void save(Order order) {    this.eventPublisher.publishEvent(new OrderEvent("create oder event", new Order()));  }}

基于注解方式實(shí)現(xiàn)事件監(jiān)聽

你可以使用 @EventListener 注解在任意Bean 的任何方法上注冊事件監(jiān)聽器。示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

static class MyEventListener {      @EventListener  public void receiveOrderEvent(OrderEvent event) {    System.out.printf("監(jiān)聽到定義事件:%s", event.getOrder().toString()) ;  }  }

通過一個(gè)注解,實(shí)現(xiàn)了事件的監(jiān)聽,在該方法中指定了要監(jiān)聽的事件類型。5j928資訊網(wǎng)——每日最新資訊28at.com

如果你的方法需要監(jiān)聽多個(gè)事件,或者你想定義一個(gè)不帶任何參數(shù)的方法,也可以在注解中指定事件類型。示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

@EventListener({OrderEvent.class, UserEvent.class})public void receiveOrderEvent() {  System.out.printf("監(jiān)聽到定義事") ;}

這里指明了只監(jiān)聽OrderEvent, UserEvent兩個(gè)事件。5j928資訊網(wǎng)——每日最新資訊28at.com

也可以直接通過ApplicationEvent攜帶參數(shù),這樣可以通過判斷處理不同的事件類型,示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

@EventListener({OrderEvent.class, UserEvent.class})public void receiveOrderEvent(ApplicationEvent event) {  System.out.printf("監(jiān)聽到定義事件:%s", event.getSource()) ;}

我們還可以通過SpEL表達(dá)式過濾事件,示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

// User對象static class User {  private Integer type ;  public User(Integer type) {    this.type = type ;  }}// UserEvent事件對象static class UserEvent extends ApplicationEvent {  private User user ;  public UserEvent(Object source, User user) {    super(source) ;    this.user = user ;  }  public User getUser() {    return user;  }} // 事件監(jiān)聽; 過濾只有User對象的type屬性為1時(shí)才會觸發(fā)事件@EventListener(condition = "#event.user.type == 1")public void receiveOrderEvent(UserEvent event) {  System.out.printf("監(jiān)聽到定義事件:%s", event.getUser()) ;}

3. 異步事件監(jiān)聽

異步方式1:5j928資訊網(wǎng)——每日最新資訊28at.com

如果想讓某個(gè)監(jiān)聽器異步處理事件,可以通過 @Async 注解支持,示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

@EventListener@Asyncpublic void receiveOrderEvent(UserEvent event) {  System.out.printf("%s - 監(jiān)聽到定義事件:%s", Thread.currentThread().getName(), event.getUser()) ;}

執(zhí)行結(jié)果:5j928資訊網(wǎng)——每日最新資訊28at.com

SimpleAsyncTaskExecutor-1 - 監(jiān)聽到定義事件:com.pack.main.events.EventMain$User@abb3dc

異步方式2:5j928資訊網(wǎng)——每日最新資訊28at.com

自定義一個(gè)事件發(fā)布器5j928資訊網(wǎng)——每日最新資訊28at.com

@Beanpublic SimpleApplicationEventMulticaster applicationEventMulticaster() {  SimpleApplicationEventMulticaster applicationEventMulticaster = new SimpleApplicationEventMulticaster();  applicationEventMulticaster.setTaskExecutor(Executors.newSingleThreadExecutor()) ;  return applicationEventMulticaster ;}

有個(gè)該事件發(fā)布器,容器在初始化時(shí)會先從容器中查找注冊的自定義發(fā)布器,源碼如下:5j928資訊網(wǎng)——每日最新資訊28at.com

protected void initApplicationEventMulticaster() {    ConfigurableListableBeanFactory beanFactory = getBeanFactory();    // 判斷容器中是否有beanName = applicationEventMulticaster 的Bean    if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {      this.applicationEventMulticaster =          beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);    } else {      // 如果不存在則注冊一個(gè)默認(rèn)的,該默認(rèn)的將使用默認(rèn)的當(dāng)前執(zhí)行線程執(zhí)行      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);    }  }

執(zhí)行結(jié)果:5j928資訊網(wǎng)——每日最新資訊28at.com

pool-1-thread-1 - 監(jiān)聽到定義事件:com.pack.main.events.EventMain$User@50f8a6

異步事件注意事項(xiàng):5j928資訊網(wǎng)——每日最新資訊28at.com

  1. 如果異步事件監(jiān)聽器拋出異常,它不會傳播給調(diào)用者。對于使用@Async的可以參考 AsyncUncaughtExceptionHandler。
  2. 異步事件監(jiān)聽器方法不能通過返回值來發(fā)布后續(xù)事件。如果需要將另一個(gè)事件作為處理結(jié)果發(fā)布,請注入 ApplicationEventPublisher 以手動(dòng)發(fā)布事件。

4. 事件監(jiān)聽順序

如果需要在調(diào)用一個(gè)監(jiān)聽器之前調(diào)用另一個(gè)監(jiān)聽器,可以在方法聲明中添加 @Order 注解,示例如下:5j928資訊網(wǎng)——每日最新資訊28at.com

@EventListener@Order(1)public void receiveOrderEvent1(UserEvent event) {  System.out.printf("%s - 監(jiān)聽到定義事件 - 1:%s%n", Thread.currentThread().getName(), event.getUser()) ;}@EventListener@Order(0)public void receiveOrderEvent2(UserEvent event) {  System.out.printf("%s - 監(jiān)聽到定義事件 - 2:%s%n", Thread.currentThread().getName(), event.getUser()) ;}

@Order中指定的值越小優(yōu)先級越高,執(zhí)行結(jié)果如下:5j928資訊網(wǎng)——每日最新資訊28at.com

main - 監(jiān)聽到定義事件 - 2:com.pack.main.events.EventMain$User@96bacfmain - 監(jiān)聽到定義事件 - 1:com.pack.main.events.EventMain$User@96bacf

完畢!!!5j928資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-16278-0.htmlSpring事件機(jī)制,深入剖析,提升你的技術(shù)水平!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot應(yīng)用中的配置文件選擇:YAML vs. Properties

下一篇: Go語言高級特性:Context深入解讀

標(biāo)簽:
  • 熱門焦點(diǎn)
Top