java方法體邏輯不會寫怎么辦,想自己寫框架?不會寫Java注解可不行

2dae860d8c98974debb7a5ea194dd4d8.png

用注解一時爽,一直用一直爽

Java后端開發進入spring全家桶時代后,開發一個微服務提供簡單的增刪改查接口跟玩泥巴似的非常簡單,一頓操作猛如虎,回頭一看代碼加了一堆注解:@Controller @Autowired @Value,面向注解編程變成了大家不可缺少的操作。

想象一下如果沒有注解Java程序員可以要哭瞎😭

既然注解(annotation)這么重要,用的這么爽,那注解的實現原理你知道么?我猜你只會用注解不會自己寫注解(手動滑稽)。

好了,下面的內容帶大家從零開始寫一個注解,揭開注解神秘的面紗。

原來注解不神秘

注解用大白話來說就是一個標記或者說是特殊的注釋,如果沒有解析這些標記的操作那它啥也不是。

注解的格式如同類或者方法一樣有自己特殊的語法,這個語法下文會詳細介紹。

那如何去解析注解呢?這就要用到Java強大的反射功能了。反射大家應該都用過,可以通過類對象獲取到這個類的各種信息比如成員變量、方法等,那注解標記能不能通過反射獲取呢?當然可以了。

所以注解的原理其實很簡單,本質上是通過反射功能動態獲取注解標記,然后按照不同的注解執行不同的操作,比如@Autowired可以注入一個對象給變量賦值。

看到這里是不是很躁動啊,來吧自己也擼一個注解。

造火箭啦,自己動手寫一個注解

便于大家理解,這里先引入一個場景:在線教育火了,經理讓我寫一個模塊實現學生信息管理功能,考慮到分布式并發問題,經理讓我務必加上分布式鎖。

經理問我幾天能搞定?我說至少3天。如是腦補了以下代碼:

2d8ce1a066a83db6e46b35b9b8000d2a.png

未使用注解前

經理走后我在思考,我能不能只花一天時間寫完,剩下兩天時間用來寫博客劃水呢?突然靈感來了,我可以把重復的代碼邏輯抽出來用注解實現不就節省代碼了,哈哈,趕緊寫。

使用注解之后整個方法清爽了很多,HR小姐姐都夸我寫的好呢。

d5ee6f175f6b9850b7d6a59e18c4aaf6.png

使用注解后

代碼已經寫完上庫了,現在我在劃水寫博客呢。是不是很簡潔很優雅很牛逼,怎么做到的呢,主要分為三步:1打開冰箱門,2把大象放進去,3把冰箱門關好。好了,扯遠了,大家接著往下看。

第一步定義一個注解

900e46b6522fae86dfaefca4ec45885b.png

注解的三大組成部分

一個注解可以簡單拆解為三個部分:

第一部分:注解體

注解的定義有點類似于接口(interface),只不過前面一個加了一個@符號,這個千萬不能省。

第二部分:注解變量

注解變量的語法有點類似于接口里面定義的方法,變量名后面帶一對括號,不同的是注解變量后面可以有默認值。另外返回值只能是Java基本類型、String類型或者枚舉類,不可以是對象類型。

第三部分:元注解

元注解(meta-annotation)說白了就是給注解加注解的注解,是不是有點暈了,這種注解是JDK提前內置好的,可以直接拿來用的。不太懂也沒有關系反正數量也不多,總共就4個,我們背下來吧:@Target @Retention @Documented @Inherited

Target注解

用來描述注解的使用范圍,即被修飾的注解可以用在什么地方 。

注解可以用于修飾 packages、types(類、接口、枚舉、注解類)、類成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數),在定義注解類時使用了@Target 能夠更加清晰的知道它能夠被用來修飾哪些對象,具體的取值范圍定義在ElementType.java 枚舉類中。

比如上面我們寫的Redis鎖的注解就只能用于方法上了。

Retention注解

用來描述注解保留的時間范圍,即注解的生命周期。在 RetentionPolicy 枚舉類中定義了三個周期:

public?enum?RetentionPolicy?{

SOURCE,?//?源文件保留

CLASS,??//?編譯期保留,默認值

RUNTIME?//?運行期保留,可通過反射去獲取注解信息

}

像我們熟知的@Override注解就只能保留在源文件中,代碼編譯后注解就消失了。比如上面我們寫的Redis鎖的注解就保留到了運行期,運行的時候可以通過反射獲取信息。

Documented注解

用來描述在使用 javadoc 工具為類生成幫助文檔時是否要保留其注解信息,很簡單不多解釋了。

Inherited注解

被Inherited注解修飾的注解具有繼承性,如果父類使用了被@Inherited修飾的注解,則其子類將自動繼承該注解。

好了,這一步我們已經將注解定義好了,但是這個注解如何工作呢?接著看。

第二步實現注解的業務邏輯

在第一步中我們發現定義的注解(@EnableRedisLock)中沒有業務邏輯,只有一些變量,別忘了我們的注解是要使能Redis分布式鎖的功能,那這個注解到底是怎么實現加鎖和釋放鎖的功能呢?這個就需要我們借助反射的強大功能了。

fcaf03512db611cda261b8594af7db1a.png

注解的操作

這里借助了切面的功能,將EnableRedisLock注解作為一個切點,只要方法上標注了這個注解就會自動執行這里的代碼邏輯。

通過反射機制拿到注解對象后就可以執行加鎖解鎖的常用邏輯啦。Redis實現分布式鎖相信大家已經很熟悉了,這里就不在啰嗦了。

第三步在業務代碼中盡情的使用注解

@EnableRedisLock(lockKey?=?"student",?expireTime?=?10,?timeUnit?=?TimeUnit.SECONDS,?retryTimes?=?5)

public?void?method1(Student?student){

//?這里寫業務邏輯

}

在需要加鎖的方法上直接加上注解就可以啦,怎么樣是不是很簡單呀,趕緊在你的項目中運用起來吧。

好了,自己寫一個注解的內容就介紹到這里了,學會了嗎?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533545.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533545.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533545.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聯想拯救者y7000加內存條_短測聯想拯救者Y7000,到底值不值得買?

7000塊左右的筆記本電腦有什么好選擇,我相信這是很多人一直糾結的問題,雖然我用過的筆記本很多,但是這個價位的用的少之又少,但隨著十代酷睿標壓處理器的大量鋪貨,聯想拯救者Y7000進入了我的視線。那到底值不值得買呢&…

php適用于什么服務器,php – 找不到laravel類(適用于localhost但不適用于DO服務器)...

這是一個重復的問題 – 例如:Laravel 4 migrations – class not found但是,我已經嘗試了所有解決方案(來自我能找到的每個論壇)并且無法解決這個問題.腳本我在我的本地機器上創建了一個Laravel 4項目 – 添加了一些類,控制器,視圖等 – 項目運行良好.然后我將這個新…

python掃雷游戲課程設計小組任務計劃與分配表_python實現掃雷游戲

本文為大家分享了python實現掃雷游戲的具體代碼,供大家參考,具體內容如下本文實例借鑒mvc模式,核心數據為model,維護1個矩陣,0表無雷,1表雷,-1表已經檢測過。本例使用python的tkinter做gui,由于…

時間同步服務器java,Windows 配置時間同步服務器以及配置時間同步間隔

如何修改windows下的時間同步間隔操作步驟如下:打開注冊表:在“開始”菜單→“運行”項下(或按WinR)輸入“Regedit”進入注冊表編輯器。2.修改默認時間服務器IP:展開HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services->W…

房價python爬取_python爬取并解析 重慶2015-2019房價走勢

1 #! /usr/bin/env python2 #-*- coding:utf-8 -*-34 5 Created on 2019年11月24日67 author: Admin8 910 importrequests11 from lxml importetree12 importtime13 importcsv1415 16 方法名稱:spider17 功能: 爬取目標網站,并以源碼文本18 參…

PHP遞歸刪除目錄面試題,PHP 遞歸刪除目錄中文件

/*** 遞歸刪除目錄中文件* param $pathname* return bool*/public static function delDir($pathname)//要刪除的目錄{if(file_exists($pathname)) {if(is_file($pathname)) {unlink($pathname);} else {$dir opendir($pathname);while($filename readdir($dir)) {if($filena…

python中 12_python編程中常用的12種基礎知識總結

1、正則表達式替換目標: 將字符串line中的 overview.gif 替換成其他字符串>>> line >>> more.compile(r(?<SRC)"([\w\.])",re.I)>>> mo.sub(r"\1****",line)>>> mo.sub(rreplace_str_\1,line)< /span>>&…

php smarty分頁原理,SMARTY分頁詳解

<?phprequire_once (include/common.inc.php);//這里是個接口common.inc.php里面包函了一些常用到的函數類庫以及SMARTYinclude_once(header.php);//調用頭部信息,SESSION的信息全都保存在這里,這樣做的好處是幾乎所有的頁面都不需要在開頭輸入session_start();$smarty new…

python十個一行_python 如何將一系列數字十個一行輸出

展開全部答案如下&#xff1a;代碼詳解1、使用循環輸出列表&#xff0c;利用 計數器控制輸出數量&#xff0c;當輸出到第十個&#xff0c;62616964757a686964616fe4b893e5b19e31333365663532計數器歸零&#xff0c;重新開始計數2、print輸出增加end參數可以控制輸出后以什么結尾…

sql oracle 遞歸查詢語句,Oracle使用SQL語句進行遞歸查詢

idpid問題描述&#xff1a;102031415262738495取出id為1及其下屬的所有的數據,結果為下idpid1031417384SQL> CREATE TABLE TBL_TEST2 (3 ID NUMBER,4 NAME VARCHAR2(100 BYTE),5 PID NUMBER DEFAULT 06 );Table createdS…

python中與0xf2相等的是_python中__str__與__repr__

(1)背景python中&#xff0c;對于類(自定義類)的實例對象的默認顯示既沒有太大用處&#xff0c;也不美觀。比如&#xff1a;1 classadder:2 def __init__(self,value0):3 self.datavalue #初始化數據4 def __add__(self,other):5 self.dataother6>>> xadder()7>>…

oracle清理asm歸檔日志,【Oracle】 rman 刪除歸檔日志的命令

因為數據倉庫上asm的磁盤空間不足&#xff0c;需要刪除早期的歸檔日志&#xff0c;查看資料有以下兩種方式&#xff1a;delete archivelog until time sysdate-N;delete archivelog all completed before sysdate-N;這兩個命令的差別在哪里呢&#xff1f;使用list 命令來查看一…

求逆矩陣計算器_991CN的矩陣運算

昨天的推文中說了一道二端口的題目&#xff0c;虛線中的大二端口由兩個小二端口級聯而成&#xff0c;在計算過程中&#xff0c;我們需要使用到矩陣的運算&#xff0c;昨天講題的時候說會說一下用計算器進行矩陣運算&#xff0c;今天我們就來說一下。其實在算電路的時候&#xf…

去快捷方式小箭頭_電腦桌面如何快速去掉快捷方式小箭頭

我們使用電腦時會發現在電腦桌面圖標上經常有一個小箭頭&#xff0c;這是什么原因呢&#xff1f;原來&#xff0c;這個小箭頭只存在于快捷方式的軟件圖標上&#xff0c;就是說通過快捷方式創建的圖標就有這個小箭頭。那么如何去掉這些小箭頭呢&#xff01;不知道也沒關系&#…

Oracle里silent,靜默方式(silent)安裝Oracle軟件

有的時候不方便登陸Linux/Unix的圖形界面安裝數據庫&#xff0c;且GUI方式安裝讓我們無法知道具體是做了什么操作&#xff0c;我們完全可以采用命令模式安裝和刪除Oracle軟件(代替OUI)、建立和刪除數據庫庫(代替dbca)。平臺&#xff1a;RHEL4.5&#xff0c;Oracle10.2.0.11、上…

oracle 移動日志文件,Oracle數據庫移動數據文件、日志文件和控制文件

1、關閉數據庫SQL> shutdown immediate;2、移動數據文件和日志文件到新位置SQL> host mv /u01/olddata.dbf /u02/newdata.dbf;SQL> host mv /u01/oldredo.log /u02/newredo.log;3、以加載模式啟動數據庫SQL> startup mount;4、在數據庫中更改數據文件和日志文件路徑…

python3導入_Python3導入相對還是絕對的正確方法?

我正在編寫一個python模塊。在Python2中一切正常&#xff0c;但在Python3中&#xff0c;導入失敗。這是我的代碼結構。neuralnet/__init__.pytrain.py # A wrapper to train (does not define new things)neuralnet.py # Defines the workhorse class neuralnetlayers/__init__…

oracle pdb是什么意思,淺談Oracle數據庫12c PDB技術

PDB大致功能描述&#xff1a;創建&#xff1a;用create pluggable database的命令&#xff0c;用file_name_convert的方式拷貝seed pdb的文件到對應的新pdb的路徑下。拷貝的是最基本system和sysaux表空間&#xff0c;將新建的pdb從mount的狀態打開到read write的狀態。建立pdb用…

oracle查詢sql時間ain,Oracle SQL 時間查詢

一、在使用Oracle的to_date函數來做日期轉換時&#xff0c;很多Java程序員也許會和我一樣&#xff0c;直覺的采用ldquo;yyyy-MM-dd HH:mm:ssrdquo;的to_date()與24小時制表示法及mm分鐘的顯示&#xff1a;一、在使用Oracle的to_date函數來做日期轉換時&#xff0c;很多Java程序…

室內定位算法_001:室內定位算法技術咨詢服務工作室簡介(更新)

點擊藍字關注我們團隊成員&#xff1a;何博士(中國科學院大學&#xff0c;博士) 楊博士(加拿大多倫多大學&#xff0c;博士后)微信聯系號&#xff1a;UWB_cwhe服務模式&#xff1a;1. 為企業提供定位算法技術支持與指導&#xff0c;以提高企業室內定位系統產品的穩定…