GreenDAO系列(二) GreenDao 代碼生成策略分析

簡介

本篇文章主要介紹GreenDao的代碼生成策略的實現(xiàn)方式镰烧,以及介紹Android中常用開源框架的代碼生成策略,通過對GreenDao代碼生成方法的研究和學習,提升自我編程能力验夯,嘗試編寫代碼生成框架的目的郊楣。
本文是介紹GreenDao系列文章的第二篇憔恳,前面一篇是對GreenDao框架的介紹,以及GreenDao的使用净蚤。后面還會有一篇是對GreenDao與數據庫打交道相關的講解钥组。

目錄

  • 1.GreenDao結構
  • 2.GreenDao頂級視圖
  • 3.GreenDao代碼生成流程圖
  • 4.Gradle 插件相關
  • 5.Android注解相關
  • 6.代碼生成框架FreeMarker
  • 7.相關參考

1.GreenDao結構

GreenDao相關包介紹

GreenDao框架中組件共有6個,這其中不僅包含咱們引入的工程中的代碼也包含GreenDao使用gradle的插件執(zhí)行代碼今瀑,代碼對比工具程梦、注解生成對象的相關点把。
Android中使用比較常見的注解處理器是APT,但是GreenDao使用的是JDT屿附。
GreenDao官方提供的是代碼開源郎逃,但是在GreenDao的GitHub只提供了greendao、greendao-api挺份、greendao-generator這三個模塊痕钢,另外三個模塊在Gradle的cache文件夾中也是找不到源碼的继阻,要想學習這部分源碼只能反編譯和分析來解決旬牲。

2.GreenDao頂級視圖

GreenDao頂級視圖

上圖對照著GreenDao的整體架構進行分析猎贴,繪制出來的GreenDao整體結構圖。包含GreenDao的各個組件以及開發(fā)者使用GreenDao中的注解編寫代碼各聘,注解生成的代碼和GreenDao的配合完成程序與數據庫打交道的工作揣非。

先從左上角的模塊開始,original-model是android開發(fā)者使用GreenDao的注解編寫代碼躲因,編寫出最原始的model類妆兑,添加上GreenDao的注解。這時候GreenDao的使用者就初步完成了工作毛仪。
再看左上角的greendao-api 注解即標準搁嗓,所謂的GreenDao注解就是在這里定義的,開發(fā)者依據greendao-api中的注解添加到的model中箱靴,GreenDao代碼生成相關模塊也是依據greendao-api中的注解來生成對應的dao代碼腺逛。到此GreenDao的代碼編寫和生成代碼邏輯似乎有一些眉目了。
再來看結構圖的右上這部分模塊衡怀,greendao-gradle-plugin模塊是Gradle的插件棍矛。就是android在編譯時使用的編譯工具Gradle,別和GreenDao弄混了抛杨。使用Gradle插件的目的是每次在編譯的時候够委,就會有相關執(zhí)行代碼的入口,GreenDao就可以在這個時機來生成代碼怖现。提醒開發(fā)者注意的是Gradle的插件是在編譯期執(zhí)行的茁帽,就意味著不會影響app代碼在用戶手機的運行效率,但是會影響apk的編譯速度屈嗤。在選擇使用GreenDao的時候也要考慮這方面的因素潘拨。
使用GreenDao除了官方樣例那樣全部引入以外,還有另外一種方案饶号,就是用Demo工程去生成代碼铁追,再將生成出來的代碼copy到主工程中使用,主工程只依賴greendao-core和greendao-api茫船,GreenDao的Gradle插件在主工程并不使用琅束,在Demo工程執(zhí)行插件生成代碼的工作扭屁。此方法提供給大家參考和選擇。
greendao-code-modifier是代碼自動生成模塊的中間控制者涩禀,比對代碼中的注解是否需要重新生成料滥,調用greenrobot-jdt收集代碼中的注解信息。
greendao-code-modifier模塊調用greendao-generator來生成對應的代碼埋泵,greendao使用的代碼生成模板為freemarker開源框架幔欧。
結構圖的下半部分是與數據庫打交道的部分罪治,也就是實際代碼運行的部分丽声,最上面的是生成的代碼DaoMaster、DaoSession觉义、Dao雁社,一般會生成這三個類,在一定條件下還會生成entity和content-provider晒骇、dao-unit-test相關的代碼霉撵。
下半部分的中間是greendao-core模塊,就是生成的代碼與greendao-core代碼配合實現(xiàn)與最底下的SQLlite通訊完成數據庫相關的操作洪囤。

3.GreenDao代碼生成流程圖

GreenDao流程圖

以上是GreenDao相關的代碼生成的實現(xiàn)徒坡,下面是相關技術點的介紹,如果有對下面的技術點了解的可以跳過其中的章節(jié)瘤缩。

4.Gradle 插件相關

如何開發(fā)一個gradle plugin喇完,網上例子很多,這里簡單列舉自定義Gradle plugin插件的步驟

  • 1.新建module剥啤,刪除module中大部分內容锦溪。
  • 2.新建MyPlugin.groovy,實現(xiàn)org.gradle.api.Plugin接口,apply入口方法府怯。
  • 3.建立resources目錄刻诊、創(chuàng)建.properties文件.
  • 4.配置gradle文件、上傳maven庫牺丙。
  • 5執(zhí)行插件则涯。

注意:這里properties的名字及里邊的配置,以及Gradle文件中的配置只有實踐嘗試了之后才能搞明白都是做什么用的冲簿。在本篇文章的最后面有參考自定義Gradle的插件的鏈接是整,可以學習一下。
GreenDao的Gradle插件的代碼是
greendao-gradle-plugin-3.2.2.jar --> Greendao3GradlePlugin

5.Android注解相關

這部分是對注解和注解處理器做簡單的介紹民假,有了這些基礎才能對GreenDao中注解相關知識分析明白浮入,以及研究明白這些代碼是怎么串聯(lián)起來的和這些代碼是做什么用的。如果對注解和注解處理器已經熟悉了可以直接跳過這部分介紹羊异。

Annotation(注解)是JDK5.0及以后版本引入的事秀。它可以用于創(chuàng)建文檔彤断,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時檢查易迹。從某些方面看宰衙,annotation就像修飾符一樣被使用,并應用于包睹欲、類 型供炼、構造方法、方法窘疮、成員變量袋哼、參數、本地變量的聲明中闸衫。這些信息被存儲在Annotation的“name=value”結構對中涛贯。

功能作用:
1.編寫文檔:通過代碼里標識的元數據生成文檔
2.代碼分析:通過代碼里標識的元數據對代碼進行分析
3.編譯檢查:通過代碼里標識的元數據讓編譯器能實現(xiàn)基本的編譯檢查

根據注解使用的方法和用途分類:
1.JDK內置系統(tǒng)注解
2.元注解
3.自定義注解

元注解
1.@Target 描述注解修飾的范圍, 類蔚出、接口弟翘、包、方法等類型骄酗。
2.@Retention 注解被保留的時間長短
3.@Document javadoc
4.@Inhrited 注解類的繼承關系
(注:元注解的作用就是負責注解其他注解 java 5.0定義了4個)

RetentionPoicy取值
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運行時有效(即運行時保留)

GreenDao中的注解是在greendao-api-3.2.2.jar 包中定義的稀余、全部為source級別。

開發(fā)中常見的注解處理器有反射趋翻、APT睛琳、JDT等。
反射在java開發(fā)中是比較常見的嘿歌、apt是android開發(fā)經常使用的方式掸掏、jdt是eclipse開發(fā)工具使用的處理器。這個在國內用的比較少宙帝。JDT的介紹是我從eclipse官網找到的丧凤,在文章最后有相關的鏈接。
JDT為Eclipse中的Java 5項目添加了注釋處理支持步脓,它提供了以下功能:
支持為Sun的命令行apt工具編寫的運行注釋處理器愿待。
增量構建期間基于注釋的構建構件的貢獻。
基于注釋的問題的問題標記的貢獻靴患。

GreenDao使用的注解處理器是JDT仍侥。

6.代碼生成框架FreeMarker

FreeMarker不是什么新技術,在java服務端的開發(fā)中已經使用好多年鸳君,基本原理就是寫一個模板农渊,然后在模板里加入判斷和變量,支持一些基本的聲明或颊、變量砸紊、判斷传于、循環(huán)等語法。將實體類已對象的形式作為參數傳遞到模板中醉顽,最后將對象的值和模板進行結合生成對應的代碼沼溜。做android的同學可以用DataBinding、MVVM來做比較學習游添,原理相似系草。FreeMarker還是比較容易學習,在本篇文章的最后有FreeMarker的入門文章鏈接唆涝。

在GreenDao中代碼生成邏輯是以DaoGenerator.generateAll()作為入口找都。使用FreeMarker實現(xiàn)的生成代碼的引擎。

生成代碼的方式有很多種石抡,最基礎的是拼接字符串的形式實現(xiàn)檐嚣,傳入變量去拼接助泽,然后將字符串寫到一個文件中啰扛。還有一種生成代碼的方式叫javapoet的,使用javapoet的語法定義文件嗡贺、類隐解、方法,然后將方法放入類中诫睬,類放入文件中煞茫,是個挺有意思的框架,有感興趣的可以了解一下摄凡。當然還有FreeMarker類似的框架velocity续徽,這些都是java模板引擎生成代碼的框架。

大家可以學習完GreenDao生成代碼之后自己去練習寫一個生成代碼的框架亲澡,已到達復用的目的钦扭,這也是高級工程師、架構設計師的基本技能手段床绪。

7.相關參考

GreenDao github地址
https://github.com/greenrobot/greenDAO
Gradle插件開發(fā)
http://www.reibang.com/p/d53399cd507b
JDT 介紹
http://www.eclipse.org/jdt/overview.php
注解處理器
https://blog.csdn.net/u013045971/article/details/53509237
自定義注解
https://blog.csdn.net/u013045971/article/details/53433874
FreeMarker 快速入門
https://segmentfault.com/a/1190000011768799

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末客情,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子癞己,更是在濱河造成了極大的恐慌膀斋,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹雅,死亡現(xiàn)場離奇詭異仰担,居然都是意外死亡,警方通過查閱死者的電腦和手機绩社,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門摔蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來技掏,“玉大人,你說我怎么就攤上這事项鬼⊙剖幔” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵绘盟,是天一觀的道長鸠真。 經常有香客問我,道長龄毡,這世上最難降的妖魔是什么吠卷? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮沦零,結果婚禮上祭隔,老公的妹妹穿的比我還像新娘。我一直安慰自己路操,他們只是感情好疾渴,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屯仗,像睡著了一般搞坝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魁袜,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天桩撮,我揣著相機與錄音,去河邊找鬼峰弹。 笑死店量,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鞠呈。 我是一名探鬼主播融师,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粟按!你這毒婦竟也來了诬滩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤灭将,失蹤者是張志新(化名)和其女友劉穎疼鸟,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體庙曙,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡空镜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴攒。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡张抄,死狀恐怖,靈堂內的尸體忽然破棺而出洼怔,到底是詐尸還是另有隱情署惯,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布镣隶,位于F島的核電站极谊,受9級特大地震影響,放射性物質發(fā)生泄漏安岂。R本人自食惡果不足惜轻猖,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望域那。 院中可真熱鬧咙边,春花似錦、人聲如沸次员。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翠肘。三九已至檐束,卻和暖如春辫秧,著一層夾襖步出監(jiān)牢的瞬間束倍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工盟戏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绪妹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓柿究,卻偏偏與公主長得像邮旷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝇摸,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,526評論 25 707
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 今天繼續(xù)婶肩,預計學習jquery1h30min,現(xiàn)在開始計時貌夕! …… 今天學到這里了律歼,有進步,明天繼續(xù)
    流落泊413閱讀 261評論 0 0
  • 有法國梧桐的地方啡专,就適合走路和停駐险毁;春夏有亭亭青傘,足以庇蔭思緒,秋冬有沙沙落葉畔况,踩出滿地韻律鲸鹦。世界上有兩...
    舞小麥閱讀 581評論 1 3
  • 夜晚 時間消失漆黑的街道 一把剪刀把夢剪成兩半你漂浮在眉心之上一條條憂傷的傷口藏在了我額頭蕩漾的皺紋中一個深不可測...
    阿基拉閱讀 372評論 0 11