成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

居然可以這樣監(jiān)聽,你學(xué)會(huì)了嗎?

安全 應(yīng)用安全
本小節(jié)首先學(xué)習(xí)了Spring 監(jiān)聽的基本機(jī)制,了解到監(jiān)聽體系有三大關(guān)鍵要素:事件監(jiān)聽器、事件、事件廣播器,事件監(jiān)聽器會(huì)提前注冊到事件廣播器中,當(dāng)感興趣的事件發(fā)生后事件廣播器會(huì)通知到事件監(jiān)聽器,這樣事件監(jiān)聽器就可以根據(jù)業(yè)務(wù)場景進(jìn)行響應(yīng)。

?前面講到要使自定義注解生效需要寫一段驅(qū)動(dòng)代碼,那驅(qū)動(dòng)代碼什么開始執(zhí)行比較合適呢?大家可能知道答案:應(yīng)用啟動(dòng)的時(shí)候。

回到具體的代碼實(shí)現(xiàn)中,假設(shè)應(yīng)用程序(客戶端或服務(wù)端)依賴了 RPC框架并且使用了Spring?環(huán)境,對Spring?比較熟悉的小伙伴應(yīng)該知道,Spring?在啟動(dòng)的過程中會(huì)初始化bean?,那是不是可以在初始化bean之后去執(zhí)行這段驅(qū)動(dòng)代碼呢?答案是肯定的。

查閱相關(guān)資料后,Spring 監(jiān)聽器可以實(shí)現(xiàn)上面這個(gè)訴求。

Spring 監(jiān)聽器

監(jiān)聽器在使用過程中可以監(jiān)聽某些感興趣的事件,監(jiān)聽到事件來臨時(shí)可以做出響應(yīng)處理。

Spring事件監(jiān)聽體系包括三大核心組件:事件監(jiān)聽器、事件、事件廣播器,如下圖:

圖片

Spring 監(jiān)聽器

事件廣播器

事件廣播器或者叫事件多播器負(fù)責(zé)廣播發(fā)生的事件并通知所有監(jiān)聽器,所有的事件監(jiān)聽器都會(huì)提前注冊在事件廣播器中。

事件

所有的動(dòng)作都可能被定義為一個(gè)事件,事件發(fā)生后事件廣播器通知所有的監(jiān)聽器,監(jiān)聽器根據(jù)情況做出響應(yīng)。

Spring 定義了一個(gè)事件基類:ApplicationEvent,看一下源碼:

public abstract class ApplicationEvent extends EventObject {
/** 事件發(fā)生的時(shí)間 */
private final long timestamp;

/**
* 創(chuàng)建一個(gè)實(shí)例
* @param source 事件來源
*/
public ApplicationEvent(Object source){
super(source);
this.timestamp = System.currentTimeMillis();
}
……省略其他代碼
}

ApplicationEvent? 繼承 JDK 定義的事件基類:EventObject,

public class EventObject implements java.io.Serializable {
/**
* The object on which the Event initially occurred.
*/
protected transient Object source;
……省略其他代碼
}

ApplicationEvent 是一個(gè)抽象類,如果需要自定義事件需要繼承這個(gè)類:

public class MyEvent extends ApplicationEvent {
……省略其他代碼
}

當(dāng)然 Spring 自身已經(jīng)定義了非常多的事件:

  • ContextRefreshedEvent:ApplicationContext 被初始化或刷新時(shí),該事件被發(fā)布。初始化是指所有的Bean被成功裝載,后處理Bean被檢測并激活,所有Singleton Bean 被預(yù)實(shí)例化,ApplicationContext容器已就緒可用。
  • ContextStartedEvent:ApplicationContext 啟動(dòng)后,該事件被發(fā)布。
  • ContextStoppedEvent:ApplicationContext 停止后,該事件被發(fā)布。
  • ContextClosedEvent:ApplicationContext 關(guān)閉后,該事件被發(fā)布。

以上僅僅列舉了幾個(gè)常用的 Spring 事件。

根據(jù)前面分析的業(yè)務(wù)訴求,我們期望所有的bean?初始化完之后開始執(zhí)行自定義注解的驅(qū)動(dòng)代碼,所以ContextRefreshedEvent這個(gè)事件才是我們感興趣的,看一下源碼:

public class ContextRefreshedEvent extends ApplicationContextEvent {
public ContextRefreshedEvent(ApplicationContext source){
super(source);
}
}

看起來非常簡單,繼承了ApplicationContextEvent?,繼續(xù)跟一下源碼可以發(fā)現(xiàn)ApplicationContextEvent?繼承了我們上面講的ApplicationEvent。

事件監(jiān)聽器

所有的事件監(jiān)聽器都注冊在事件廣播器中,這好比觀察者模式中的觀察者。

在 Spring 中ApplicationListener?是事件監(jiān)聽器的頂層接口,繼承自 JDK 的EventListener,所有的監(jiān)聽器都必須實(shí)現(xiàn)這個(gè)接口。

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
/**
* 處理事件
* @param event 待響應(yīng)的事件
*/
void onApplicationEvent(E event);

// ……省略其他代碼
}

定義了一個(gè)onApplicationEvent方法,當(dāng)有感興趣的事件發(fā)生后就會(huì)執(zhí)行這個(gè)方法進(jìn)行處理。

實(shí)現(xiàn)自定義監(jiān)聽器

上面介紹了 Spring 監(jiān)聽體系的一些基礎(chǔ)知識(shí),并通過一些源碼進(jìn)行輔助介紹,這些代碼都不是 RPC 框架要寫的,RPC 框架當(dāng)前要做的是實(shí)現(xiàn)一個(gè)自定義監(jiān)聽器監(jiān)聽感興趣的事件。

通過結(jié)合業(yè)務(wù)訴求分析出:自定義一個(gè)監(jiān)聽器用來監(jiān)聽 Spring 內(nèi)置ContextRefreshedEvent事件。

public class DefaultRpcListener implements ApplicationListener<ContextRefreshedEvent> {
public DefaultRpcListener(){
}

@Override
public void onApplicationEvent(ContextRefreshedEvent event){
// TODO 實(shí)現(xiàn)業(yè)務(wù)邏輯
// 1 服務(wù)端邏輯處理
// 2 客戶端邏輯處理
}
}

自定義的監(jiān)聽器實(shí)現(xiàn)了ApplicationListener?接口,并重寫onApplicationEvent方法,方法中待實(shí)現(xiàn)的業(yè)務(wù)邏輯是重中之重。

待實(shí)現(xiàn)的業(yè)務(wù)邏輯中需要對@ServiceExpose和@ServiceReference?這兩個(gè)注解進(jìn)行處理,@ServiceExpose?對應(yīng)服務(wù)端,@ServiceReference對應(yīng)客戶端,所以基本就是兩大塊:服務(wù)端邏輯處理和客戶端邏輯處理。

注意一下,文中提到的服務(wù)端或客戶端是站在功能角度上看的,不能片面理解,一個(gè)應(yīng)用程序(服務(wù)或微服務(wù))既可能是服務(wù)端也可能是客戶端:

圖片

Spring 監(jiān)聽器-第 2 頁

如上圖,微服務(wù) A 調(diào)用微服務(wù) B,微服務(wù) B 又調(diào)用微服務(wù) C,微服務(wù) B 在整個(gè)調(diào)用鏈中既是客戶端又是服務(wù)端。

代碼結(jié)構(gòu)

自定義監(jiān)聽器DefaultRpcListener放在 listener 包下,目前 RPC 框架代碼工程結(jié)構(gòu)如下:

├── easy-rpc-spring-boot-starter
├── pom.xml
├── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── leixiaoshuai
│ │ └── easyrpc
│ │ ├── annotation
│ │ │ ├── ServiceExpose.java
│ │ │ └── ServiceReference.java
│ │ └── listener
│ │ └── DefaultRpcListener.java
│ └── resources
└── target

小結(jié)

本小節(jié)首先學(xué)習(xí)了Spring 監(jiān)聽的基本機(jī)制,了解到監(jiān)聽體系有三大關(guān)鍵要素:事件監(jiān)聽器、事件、事件廣播器,事件監(jiān)聽器會(huì)提前注冊到事件廣播器中,當(dāng)感興趣的事件發(fā)生后事件廣播器會(huì)通知到事件監(jiān)聽器,這樣事件監(jiān)聽器就可以根據(jù)業(yè)務(wù)場景進(jìn)行響應(yīng)。

Spring 提供了事件的基類,大家可以自定義事件,當(dāng)然也可以直接使用 Spring 內(nèi)置的事件,結(jié)合 RPC 框架的業(yè)務(wù)特點(diǎn)我們發(fā)現(xiàn)ContextRefreshedEvent事件比較符合我們的訴求。

Spring 定義了事件監(jiān)聽器ApplicationListener?頂層接口,我們只需要實(shí)現(xiàn)該接口就可以自定義一個(gè)監(jiān)聽器,在監(jiān)聽器中重寫onApplicationEvent方法實(shí)現(xiàn)相應(yīng)的業(yè)務(wù)邏輯。

自定義監(jiān)聽器主要的業(yè)務(wù)邏輯包括兩大塊:服務(wù)端和客戶端,服務(wù)端邏輯主要處理@ServiceExpose?注解,客戶端邏輯主要處理@ServiceReferece注解。關(guān)于注解處理的邏輯我們下一小節(jié)詳細(xì)講解。

責(zé)任編輯:武曉燕 來源: 愛笑的架構(gòu)師
相關(guān)推薦

2023-08-01 12:51:18

WebGPT機(jī)器學(xué)習(xí)模型

2024-01-02 12:05:26

Java并發(fā)編程

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數(shù)據(jù)組件

2023-07-26 13:11:21

ChatGPT平臺(tái)工具

2023-01-10 08:43:15

定義DDD架構(gòu)

2024-03-06 08:28:16

設(shè)計(jì)模式Java

2022-06-16 07:50:35

數(shù)據(jù)結(jié)構(gòu)鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2022-07-13 08:16:49

RocketMQRPC日志

2023-10-06 14:49:21

SentinelHystrixtimeout

2023-05-05 06:54:07

MySQL數(shù)據(jù)查詢

2023-01-31 08:02:18

2023-07-30 22:29:51

BDDMockitoAssert測試

2023-08-26 21:34:28

Spring源碼自定義

2023-03-26 22:31:29

2024-02-02 11:03:11

React數(shù)據(jù)Ref

2023-06-26 13:08:52

GraphQL服務(wù)數(shù)據(jù)

2023-10-10 11:04:11

Rust難點(diǎn)內(nèi)存

2024-05-06 00:00:00

InnoDBView隔離
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲成av人片在线观看 | 免费视频一区 | 狠狠操婷婷 | 欧美一区二区三区视频 | 久久久久久免费精品一区二区三区 | 精品久久久久久红码专区 | 日韩一区二区在线视频 | 91色网站 | 国产精品一区二区无线 | 色网站视频 | 日本免费视频在线观看 | 男女羞羞视频免费看 | 久久久久久久久国产精品 | 国产一级一级毛片 | 亚洲v区 | 一区二区影院 | 亚洲精品福利视频 | 欧美女优在线观看 | av一区在线观看 | 九九久久久 | 日本a∨精品中文字幕在线 亚洲91视频 | 综合久久99| 麻豆91av | 久久久久久免费精品一区二区三区 | 欧美一级片中文字幕 | 美女黄18岁以下禁止观看 | 亚洲成人精 | 久久综合久久综合久久综合 | 中文字幕久久久 | 777zyz色资源站在线观看 | 欧美亚洲成人网 | 国产成人精品久久久 | 久久激情视频 | 国产精品1区2区3区 国产在线观看一区 | 男女精品久久 | 免费特级黄毛片 | 亚洲一区二区精品视频 | 国产精品久久国产精品99 | 亚洲黄色网址视频 | 在线国产99 | 欧美一级二级在线观看 |