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