自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你該學(xué)會(huì)自己寫 Java 注解了

開發(fā) 前端
相信大家也發(fā)現(xiàn)了,注解類定義好之后并不能立馬生效,比如在一個(gè)類上添加注解@ServiceReference,我們期望服務(wù)啟動(dòng)后這個(gè)類能自動(dòng)暴露自己,但是你會(huì)發(fā)現(xiàn)什么也沒發(fā)生,這是為什么呢?

?我們通過Hello World這個(gè)例子引入了RPC 框架,知道了客戶端要想調(diào)用服務(wù)端需要靠?jī)蓚€(gè)注解來(lái)實(shí)現(xiàn),下面我們一起來(lái)實(shí)現(xiàn)這兩個(gè)注解。

注解相關(guān)的實(shí)現(xiàn)代碼是 RPC 框架的核心代碼,后面寫完后可以打包成一個(gè) jar 包作為框架供業(yè)務(wù)代碼中使用,這樣我們前面寫的客戶端和服務(wù)端 demo 就可以正常工作了。

好了,鋪墊這么多,我們真正開始寫 RPC 框架代碼了。RPC 框架計(jì)劃提供兩個(gè)注解:

  • @ServiceReference
  • @ServiceExpose

@ServiceReference

@ServiceReference?注解用來(lái)引用服務(wù)端提供的服務(wù),客戶端啟動(dòng)后可以自動(dòng)注入對(duì)應(yīng)的bean,像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)的方法。

首先,我們來(lái)定義一個(gè)注解類,interface?關(guān)鍵字用來(lái)聲明接口,前面加一個(gè)@?就可以用來(lái)定義注解類,如上面約定客戶端側(cè)注解名為:ServiceReference。

public @interface ServiceReference {
}

注解類還可以加很多配置項(xiàng),一般用幾個(gè)元注解進(jìn)行修飾:

@Target?表示我們定義的這個(gè)注解使用的范圍,ElementType?是枚舉類有很多枚舉值,這里我們只用到ElementType.FIELD,業(yè)務(wù)含義:當(dāng)前這個(gè)自定義注解只能在類的成員變量上使用。

@Retention?表示注解的保留策略,RetentionPolicy.RUNTIME?的意思是希望注解能一直保留到運(yùn)行期,那為什么要保留到運(yùn)行期呢?因?yàn)槲覀兿M谶\(yùn)行期通過這個(gè)注解自動(dòng)注入依賴。如果取值為RetentionPolicy.SOURCE則表示僅保存在源碼中,在代碼編譯后就會(huì)丟掉這個(gè)注解的信息。

@Documented與文檔相關(guān)的,沒有其他業(yè)務(wù)含義,這里不再贅述。

一個(gè)完整的注解類詳細(xì)代碼如下:


@Target({ElementType.FIELD})
// 注解保留策略
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ServiceReference {
}

注解已經(jīng)定義好了,代碼非常簡(jiǎn)單,使用起來(lái)也比較簡(jiǎn)單,在類的成員變量上加一個(gè)這樣的注解即可:

class A {
@ServiceReference
private XxxService xxxService;

……省略
}

可能有小伙伴要問了,為什么加一個(gè)簡(jiǎn)單的注解就能將遠(yuǎn)程服務(wù)的依賴注入進(jìn)來(lái)?這其實(shí)是框架背后的功勞,服務(wù)啟動(dòng)后會(huì)自動(dòng)掃描框架的注解,根據(jù)不同的注解框架會(huì)有對(duì)應(yīng)的初始化動(dòng)作,至于@ServiceReference的初始化邏輯我們下一個(gè)小節(jié)再詳細(xì)展開講。

下面接著看另外一個(gè)注解。

@ServiceExpose

@ServiceExpose注解用于服務(wù)端暴露自己的服務(wù)接口(方法),進(jìn)而可被客戶端發(fā)現(xiàn)調(diào)用。

與@ServiceReference?類似,定義一個(gè)注解,取名叫做:ServiceExpose。

public @interface ServiceExpose {
}

與@ServiceReference?稍微有點(diǎn)不同的是,多增加了一個(gè)元注解:@Component?以及@Target取值不一樣。

@Component是Spring?原生的注解,Spring?啟動(dòng)后會(huì)掃描注解并將其初始化一個(gè)bean?,用于配合@ServiceExpose注解使用,具體邏輯后面章節(jié)會(huì)詳細(xì)介紹。

@Target?用于約束注解的使用范圍,ElementType.TYPE表示當(dāng)前這個(gè)注解僅可在類(class)、接口(interface)、枚舉(enum)類上使用,在其他地方使用是非法的,會(huì)編譯失敗。

完整的代碼如下:

// 元注解,Spring 原生注解
@Component
// 約束注解使用范圍
@Target({ElementType.TYPE})
// 注解保留策略
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ServiceExpose {
}

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

在前面搭建環(huán)境時(shí)創(chuàng)建了一個(gè)maven?工程,我們繼續(xù)在工程中創(chuàng)建一個(gè) package并取名為:annotation,剛才寫完的兩個(gè)注解類代碼放進(jìn)去。

目前框架的代碼結(jié)構(gòu)如下:

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

小結(jié)

前面帶領(lǐng)大家寫完了框架中核心的兩個(gè)注解類:@ServiceReference? 和 @ServiceExpose?,客戶端常使用@ServiceReference?引用服務(wù)端;服務(wù)端常使用@ServiceExpose暴露自身的服務(wù)便于客戶端發(fā)現(xiàn)和使用。

定義注解的步驟非常簡(jiǎn)單:

  • 使用@interface聲明注解類
  • 注解類前面添加元注解,如:@Target、@Retention等

相信大家也發(fā)現(xiàn)了,注解類定義好之后并不能立馬生效,比如在一個(gè)類上添加注解@ServiceReference,我們期望服務(wù)啟動(dòng)后這個(gè)類能自動(dòng)暴露自己,但是你會(huì)發(fā)現(xiàn)什么也沒發(fā)生,這是為什么呢?

其實(shí)注解僅僅只是一種標(biāo)記的手段,自身并無(wú)業(yè)務(wù)邏輯,如果你希望注解實(shí)現(xiàn)預(yù)期效果,需要自己去寫一段驅(qū)動(dòng)代碼,代碼中可以通過反射方式掃描所有添加了注解的地方,然后執(zhí)行對(duì)應(yīng)的邏輯,至于什么時(shí)候執(zhí)行這段驅(qū)動(dòng)代碼,需要結(jié)合注解的保留策略,一般是編譯或者運(yùn)行中執(zhí)行。

明白了這個(gè)道理之后,要想使@ServiceReference? 和 @ServiceExpose這兩個(gè)注解實(shí)現(xiàn)對(duì)應(yīng)的功能,需要分別寫一段驅(qū)動(dòng)程序,這段代碼在后續(xù)的章節(jié)會(huì)詳細(xì)介紹,我們接著往下看。

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

2020-03-06 10:25:10

注解Java代碼

2024-01-18 09:38:00

Java注解JDK5

2021-03-29 09:37:17

SpringBoot常用注解Spring Boot

2022-11-11 08:29:24

C語(yǔ)言中文字符代碼

2022-12-22 08:14:54

2024-11-29 08:53:46

2023-09-22 08:01:10

2023-11-02 16:51:07

Python代碼

2024-01-19 08:25:38

死鎖Java通信

2025-01-07 08:37:35

2012-02-09 10:42:24

Java

2014-08-13 11:20:10

創(chuàng)業(yè)者

2024-01-29 07:43:42

Java獨(dú)占鎖共享鎖

2019-12-23 14:32:38

Java內(nèi)部類代碼

2021-11-22 23:42:02

Go監(jiān)控程序

2012-11-30 11:19:02

JavaScript

2024-03-15 08:23:26

異步編程函數(shù)

2018-03-21 16:19:40

MVCMVPMVVM

2023-11-06 17:37:17

技術(shù)架構(gòu)任務(wù)隊(duì)列

2024-06-12 00:00:00

點(diǎn)贊
收藏

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