您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么寫Java注解”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
注解用大白話來說就是一個標記或者說是特殊的注釋,如果沒有解析這些標記的操作那它啥也不是。
注解的格式如同類或者方法一樣有自己特殊的語法,這個語法下文會詳細介紹。
那如何去解析注解呢?這就要用到Java強大的反射功能了。反射大家應該都用過,可以通過類對象獲取到這個類的各種信息比如成員變量、方法等,那注解標記能不能通過反射獲取呢?當然可以了。
所以注解的原理其實很簡單,本質上是通過反射功能動態獲取注解標記,然后按照不同的注解執行不同的操作,比如@Autowired可以注入一個對象給變量賦值。
看到這里是不是很躁動啊,來吧自己也擼一個注解。
便于大家理解,這里先引入一個場景:在線教育火了,經理讓我寫一個模塊實現學生信息管理功能,考慮到分布式并發問題,經理讓我務必加上分布式鎖。
經理問我幾天能搞定?我說至少3天。如是腦補了以下代碼:
經理走后我在思考,我能不能只花一天時間寫完,剩下兩天時間用來寫博客劃水呢?突然靈感來了,我可以把重復的代碼邏輯抽出來用注解實現不就節省代碼了,哈哈,趕緊寫。
使用注解之后整個方法清爽了很多,HR小姐姐都夸我寫的好呢。
代碼已經寫完上庫了,現在我在劃水寫博客呢。是不是很簡潔很優雅很牛逼,怎么做到的呢,主要分為三步:1打開冰箱門,2把大象放進去,3把冰箱門關好。好了,扯遠了,大家接著往下看。
一個注解可以簡單拆解為三個部分:
第一部分:注解體
注解的定義有點類似于接口(interface),只不過前面一個加了一個@符號,這個千萬不能省。
第二部分:注解變量
注解變量的語法有點類似于接口里面定義的方法,變量名后面帶一對括號,不同的是注解變量后面可以有默認值。另外返回值只能是Java基本類型、String類型或者枚舉類,不可以是對象類型。
第三部分:元注解
元注解(meta-annotation)說白了就是給注解加注解的注解,是不是有點暈了,這種注解是JDK提前內置好的,可以直接拿來用的。不太懂也沒有關系反正數量也不多,總共就4個,我們背下來吧:@Target @Retention @Documented @Inherited
用來描述注解的使用范圍,即被修飾的注解可以用在什么地方 。
注解可以用于修飾 packages、types(類、接口、枚舉、注解類)、類成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數),在定義注解類時使用了@Target 能夠更加清晰的知道它能夠被用來修飾哪些對象,具體的取值范圍定義在ElementType.java 枚舉類中。
比如上面我們寫的Redis鎖的注解就只能用于方法上了。
用來描述注解保留的時間范圍,即注解的生命周期。在 RetentionPolicy 枚舉類中定義了三個周期:
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 編譯期保留,默認值
RUNTIME // 運行期保留,可通過反射去獲取注解信息
}
像我們熟知的@Override注解就只能保留在源文件中,代碼編譯后注解就消失了。比如上面我們寫的Redis鎖的注解就保留到了運行期,運行的時候可以通過反射獲取信息。
用來描述在使用 javadoc 工具為類生成幫助文檔時是否要保留其注解信息,很簡單不多解釋了。
被Inherited注解修飾的注解具有繼承性,如果父類使用了被@Inherited修飾的注解,則其子類將自動繼承該注解。
好了,這一步我們已經將注解定義好了,但是這個注解如何工作呢?接著看。
在第一步中我們發現定義的注解(@EnableRedisLock)中沒有業務邏輯,只有一些變量,別忘了我們的注解是要使能Redis分布式鎖的功能,那這個注解到底是怎么實現加鎖和釋放鎖的功能呢?這個就需要我們借助反射的強大功能了。
這里借助了切面的功能,將EnableRedisLock注解作為一個切點,只要方法上標注了這個注解就會自動執行這里的代碼邏輯。
通過反射機制拿到注解對象后就可以執行加鎖解鎖的常用邏輯啦。Redis實現分布式鎖相信大家已經很熟悉了,這里就不在啰嗦了。
@EnableRedisLock(lockKey = "student", expireTime = 10, timeUnit = TimeUnit.SECONDS, retryTimes = 5)
public void method1(Student student) {
// 這里寫業務邏輯
}
“怎么寫Java注解”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。