使用註解的方式來自動註冊服務

2021-10-21 21:09:18 字數 1444 閱讀 1348

在實現的rpc框架中,如果使用傳統的方式來進行通訊的話,那麼服務啟動端需要先手動建立乙個提供服務的類的例項

helloservice helloservice =

newhelloserviceimpl()

;

雖然在實現過程中只有這乙個服務,好像並不會帶來太大的問題,但如果有一堆服務物件的話,那有幾個就得手動建立幾個,這樣肯定是不現實的,所以給框架加乙個自動註冊服務的方式是很有必要的。採用註解的方式來解決這個問題則是個很好的選擇。

服務端肯定要有乙個註解,當我們啟動服務端後,原本是建立乙個服務類的例項,需要將這一步省去,這個註解可以視為掃瞄註解,實現了這個註解之後,我們就知道了在這個位置需要進行掃瞄。同時,提供服務的類也可以有乙個註解,表明它提供了乙個服務。

我們就可以設計如下的流程:獲取服務啟動端所在的類名→判斷該類下有無掃瞄註解→獲取註解的值如果值與我們定義的相同,說明是我們需要操作的類→獲取它所在的包的名稱→掃瞄包下所有類,逐個判斷是否有服務註解→獲取註解類實現的介面→得到介面資訊,註冊服務

//服務註解

@target

(elementtype.type)

@retention

(retentionpolicy.runtime)

public @inte***ce

service

//掃瞄註解

@target

(elementtype.type)

@retention

(retentionpolicy.runtime)

public @inte***ce

servicescan

服務端

@servicescan

public

class

nettyservertest

}

這又會出現乙個問題,我們知道在服務端啟動時需要進行掃瞄,但是怎麼獲得這個服務端的類名呢?

我們是通過呼叫main方法來啟動服務的,當乙個方法被呼叫時,實際上是執行緒呼叫了它私有的虛擬機器棧,將方法作為乙個棧幀將其壓入虛擬機器棧中,乙個方法從開始執行到執行完畢對應的就是它的入棧和出棧過程,所以main方法肯定是在棧底的,我們可以通過new throwable().getstacktrace()方法得到棧幀資訊。

getstacktrace()返回乙個表示該執行緒堆疊轉儲的堆疊跟蹤元素陣列。如果該執行緒尚未啟動或已經終止,則該方法將返回乙個零長度陣列。如果返回的陣列不是零長度的,則其第乙個元素代表堆疊頂,它是該序列中最新的方法呼叫。最後乙個元素代表堆疊底,是該序列中最舊的方法呼叫。

public

static string getstacktrace()

有了基本思路以後,實現起來就沒那麼困難了

使用lombok註解的方式

我們知道一般在建立實體類時,都會手動 alt insert進行新增構造方法以及get和set方法等等。如果使用lombok,使用註解的方式代替手動新增方法會簡單得多。2.在idea中安裝外掛程式 file setting plugins 搜尋lombok,進行install 安裝之後重啟idea,外...

Spring使用註解方式注入多例的方式

目前spring netty的開發方式這麼火熱,想把netty註冊成spring元件就一定得用多例的方式,我不由得想吐槽明明這麼常見的需求網上相關部落格都少的很,這裡給出spring使用註解注入多例的方式 在需要多例呼叫的類上加 scope prototype 在進行注入時,不能直接使用 autow...

Spring註解 給容器註冊元件的幾種方式

1.2 方式二 1.1.1 repository service controller component 1.1.2 說明 repository service controller component這四個註解都是標註在元件 類 上,用來把元件註冊到spring容器中。註冊的每個元件,型別是它本...