java方法体逻辑不会写怎么办,想自己写框架?不会写Java注解可不行
一、用注解一時爽,一直用一直爽
Java后端開發(fā)進入spring全家桶時代后,開發(fā)一個微服務提供簡單的增刪改查接口跟玩泥巴似的非常簡單,一頓操作猛如虎,回頭一看代碼加了一堆注解:@Controller @Autowired @Value,面向注解編程變成了大家不可缺少的操作。 想象一下如果沒有注解Java程序員可以要哭瞎:sob: 既然注解(annotation)這么重要,用的這么爽,那注解的實現(xiàn)原理你知道么?我猜你只會用注解不會自己寫注解(手動滑稽)。 好了,下面的內(nèi)容帶大家從零開始寫一個注解,揭開注解神秘的面紗。
二、原來注解不神秘
注解用大白話來說就是一個標記或者說是特殊的注釋,如果沒有解析這些標記的操作那它啥也不是。 注解的格式如同類或者方法一樣有自己特殊的語法,這個語法下文會詳細介紹。 那如何去解析注解呢?這就要用到Java強大的反射功能了。反射大家應該都用過,可以通過類對象獲取到這個類的各種信息比如成員變量、方法等,那注解標記能不能通過反射獲取呢?當然可以了。 所以注解的原理其實很簡單,本質(zhì)上是通過反射功能動態(tài)獲取注解標記,然后按照不同的注解執(zhí)行不同的操作,比如@Autowired可以注入一個對象給變量賦值。 看到這里是不是很躁動啊,來吧自己也擼一個注解。
三、造火箭啦,自己動手寫一個注解
便于大家理解,這里先引入一個場景:在線教育火了,經(jīng)理讓我寫一個模塊實現(xiàn)學生信息管理功能,考慮到分布式并發(fā)問題,經(jīng)理讓我務必加上分布式鎖。 經(jīng)理問我?guī)滋炷芨愣?#xff1f;我說至少3天。如是腦補了以下代碼:
使用注解前
未使用注解前經(jīng)理走后我在思考,我能不能只花一天時間寫完,剩下兩天時間用來寫博客劃水呢?突然靈感來了,我可以把重復的代碼邏輯抽出來用注解實現(xiàn)不就節(jié)省代碼了,哈哈,趕緊寫。 使用注解之后整個方法清爽了很多,HR小姐姐都夸我寫的好呢。
使用注解后
使用注解后代碼已經(jīng)寫完上庫了,現(xiàn)在我在劃水寫博客呢。是不是很簡潔很優(yōu)雅很牛逼,怎么做到的呢,主要分為三步: 1打開冰箱門,2把大象放進去,3把冰箱門關(guān)好 。好了,扯遠了,大家接著往下看。
四、第一步定義一個注解
注解的三大組成部分
注解的三大組成部分一個注解可以簡單拆解為三個部分: 第一部分:注解體 注解的定義有點類似于接口(interface),只不過前面一個加了一個@符號,這個千萬不能省。 第二部分:注解變量 注解變量的語法有點類似于接口里面定義的方法,變量名后面帶一對括號,不同的是注解變量后面可以有默認值。另外返回值只能是Java基本類型、String類型或者枚舉類,不可以是對象類型。 第三部分:元注解 元注解(meta-annotation)說白了就是給注解加注解的注解,是不是有點暈了,這種注解是JDK提前內(nèi)置好的,可以直接拿來用的。不太懂也沒有關(guān)系反正數(shù)量也不多,總共就4個,我們背下來吧:@Target @Retention @Documented @Inherited
Target注解
用來描述注解的使用范圍,即被修飾的注解可以用在什么地方 。 注解可以用于修飾 packages、types(類、接口、枚舉、注解類)、類成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù)),在定義注解類時使用了@Target 能夠更加清晰的知道它能夠被用來修飾哪些對象,具體的取值范圍定義在ElementType.java 枚舉類中。 比如上面我們寫的Redis鎖的注解就只能用于方法上了。
Retention注解
用來描述注解保留的時間范圍,即注解的生命周期。在 RetentionPolicy 枚舉類中定義了三個周期:
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 編譯期保留,默認值
RUNTIME // 運行期保留,可通過反射去獲取注解信息
}
像我們熟知的@Override注解就只能保留在源文件中,代碼編譯后注解就消失了。比如上面我們寫的Redis鎖的注解就保留到了運行期,運行的時候可以通過反射獲取信息。
Documented注解
用來描述在使用 javadoc 工具為類生成幫助文檔時是否要保留其注解信息,很簡單不多解釋了。
Inherited注解
被Inherited注解修飾的注解具有繼承性,如果父類使用了被@Inherited修飾的注解,則其子類將自動繼承該注解。 好了,這一步我們已經(jīng)將注解定義好了,但是這個注解如何工作呢?接著看。
五、第二步實現(xiàn)注解的業(yè)務邏輯
在第一步中我們發(fā)現(xiàn)定義的注解(@EnableRedisLock)中沒有業(yè)務邏輯,只有一些變量,別忘了我們的注解是要使能Redis分布式鎖的功能,那這個注解到底是怎么實現(xiàn)加鎖和釋放鎖的功能呢?這個就需要我們借助反射的強大功能了。
注解的操作
注解的操作 這里借助了切面的功能,將EnableRedisLock注解作為一個切點,只要方法上標注了這個注解就會自動執(zhí)行這里的代碼邏輯。 通過反射機制拿到注解對象后就可以執(zhí)行加鎖解鎖的常用邏輯啦。Redis實現(xiàn)分布式鎖相信大家已經(jīng)很熟悉了,這里就不在啰嗦了。
六、第三步在業(yè)務代碼中盡情的使用注解
@EnableRedisLock(lockKey = "student", expireTime = 10, timeUnit = TimeUnit.SECONDS, retryTimes = 5)
public void method1(Student student) {
// 這里寫業(yè)務邏輯
}
在需要加鎖的方法上直接加上注解就可以啦,怎么樣是不是很簡單呀,趕緊在你的項目中運用起來吧。 好了,自己寫一個注解的內(nèi)容就介紹到這里了,學會了嗎?
七、總結(jié)
今天的知識就分享到這里!點關(guān)注,不迷路,關(guān)注程序員曾曾,每天分享不同的Java知識,如果想要知道更多的Java基礎知識以及筆試面試資料我這邊整理了一個我自己的GitHub倉庫:Java工程師修煉手冊,大家如果有需要可以自行查看
總結(jié)
以上是生活随笔為你收集整理的java方法体逻辑不会写怎么办,想自己写框架?不会写Java注解可不行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php start,php start
- 下一篇: 基于matlab的人脸五官边缘检测方法,