日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Spring事件機制,深入剖析,提升你的技術水平!

來源: 責編: 時間:2023-11-01 09:18:38 260觀看
導讀環境:Spring5.3.231. 簡介Spring事件機制是一種用于處理系統內部或者外部事件的機制,它是Spring框架的一部分。事件機制基于監聽者設計模式實現,包括事件、發布器和監聽器三個主要部分。在Spring中,事件是主體,發布器負責

環境:Spring5.3.23nED28資訊網——每日最新資訊28at.com

1. 簡介

Spring事件機制是一種用于處理系統內部或者外部事件的機制,它是Spring框架的一部分。事件機制基于監聽者設計模式實現,包括事件、發布器和監聽器三個主要部分。nED28資訊網——每日最新資訊28at.com

在Spring中,事件是主體,發布器負責發布事件,監聽器負責處理事件。事件對象封裝了事件源對象和事件相關信息,用于在事件源和監聽器之間傳遞信息。發布器通過注入事件發布者實現,使用事件發布者發布事件。監聽器通過實現ApplicationListener接口來定義,用于對事件進行處理。nED28資訊網——每日最新資訊28at.com

Spring容器提供了事件管理機制,內部很多節點都會發布事件,也支持自定義事件。在Spring Boot中,你可以使用ApplicationEventPublisher接口來發布事件,通過繼承ApplicationEvent抽象類來定義事件對象,通過實現ApplicationListener接口來定義事件監聽器。nED28資訊網——每日最新資訊28at.com

總之,Spring事件機制是一個非常有用的工具,可以幫助你更好地管理和處理系統中的事件。nED28資訊網——每日最新資訊28at.com

2. 事件發布及監聽

創建并發布自己的自定義事件。通過ApplicationEventnED28資訊網——每日最新資訊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,可以創建一個實現 ApplicationListener 的類,并將其注冊為 Spring Bean。nED28資訊網——每日最新資訊28at.com

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

要發布自定義 ApplicationEvent,調用 ApplicationEventPublisher 上的 publishEvent() 方法。通常,可以通過創建一個實現 ApplicationEventPublisherAware 的類并將其注冊為 Spring Bean 來實現:nED28資訊網——每日最新資訊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()));  }}

基于注解方式實現事件監聽

你可以使用 @EventListener 注解在任意Bean 的任何方法上注冊事件監聽器。示例如下:nED28資訊網——每日最新資訊28at.com

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

通過一個注解,實現了事件的監聽,在該方法中指定了要監聽的事件類型。nED28資訊網——每日最新資訊28at.com

如果你的方法需要監聽多個事件,或者你想定義一個不帶任何參數的方法,也可以在注解中指定事件類型。示例如下:nED28資訊網——每日最新資訊28at.com

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

這里指明了只監聽OrderEvent, UserEvent兩個事件。nED28資訊網——每日最新資訊28at.com

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

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

我們還可以通過SpEL表達式過濾事件,示例如下:nED28資訊網——每日最新資訊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;  }} // 事件監聽; 過濾只有User對象的type屬性為1時才會觸發事件@EventListener(condition = "#event.user.type == 1")public void receiveOrderEvent(UserEvent event) {  System.out.printf("監聽到定義事件:%s", event.getUser()) ;}

3. 異步事件監聽

異步方式1:nED28資訊網——每日最新資訊28at.com

如果想讓某個監聽器異步處理事件,可以通過 @Async 注解支持,示例如下:nED28資訊網——每日最新資訊28at.com

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

執行結果:nED28資訊網——每日最新資訊28at.com

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

異步方式2:nED28資訊網——每日最新資訊28at.com

自定義一個事件發布器nED28資訊網——每日最新資訊28at.com

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

有個該事件發布器,容器在初始化時會先從容器中查找注冊的自定義發布器,源碼如下:nED28資訊網——每日最新資訊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 {      // 如果不存在則注冊一個默認的,該默認的將使用默認的當前執行線程執行      this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);      beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);    }  }

執行結果:nED28資訊網——每日最新資訊28at.com

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

異步事件注意事項:nED28資訊網——每日最新資訊28at.com

  1. 如果異步事件監聽器拋出異常,它不會傳播給調用者。對于使用@Async的可以參考 AsyncUncaughtExceptionHandler。
  2. 異步事件監聽器方法不能通過返回值來發布后續事件。如果需要將另一個事件作為處理結果發布,請注入 ApplicationEventPublisher 以手動發布事件。

4. 事件監聽順序

如果需要在調用一個監聽器之前調用另一個監聽器,可以在方法聲明中添加 @Order 注解,示例如下:nED28資訊網——每日最新資訊28at.com

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

@Order中指定的值越小優先級越高,執行結果如下:nED28資訊網——每日最新資訊28at.com

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

完畢!!!nED28資訊網——每日最新資訊28at.com

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

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

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

標簽:
  • 熱門焦點
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 消費結構調整丨巨頭低價博弈,拼多多還卷得動嗎?

    來源:征探財經作者:陳香羽隨著流量紅利的退潮,電商的存量博弈越來越明顯。曾經主攻中高端與品質的淘寶天貓、京東重拾&ldquo;低價&rdquo;口號。而過去與他們錯位競爭的拼多多,靠
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top 主站蜘蛛池模板: 石柱| 泾川县| 灵山县| 陕西省| 高雄县| 宜川县| 定州市| 濮阳县| 阿坝县| 深水埗区| 元氏县| 林芝县| 昭平县| 集贤县| 蒙自县| 远安县| 博野县| 伊川县| 大冶市| 交口县| 西乌| 宁南县| 班玛县| 策勒县| 荔浦县| 甘肃省| 乌苏市| 天全县| 武冈市| 光泽县| 阿瓦提县| 玉环县| 武清区| 葫芦岛市| 临西县| 昌乐县| 花莲市| 赣榆县| 西安市| 大宁县| 东山县|