GreenDAO系列(二)GreenDao 代碼生成策略分析
簡介
本篇文章主要介紹GreenDao的代碼生成策略的實現方式,以及介紹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的插件執行代碼,代碼對比工具、註解生成對象的相關。Android中使用比較常見的註解處理器是APT,但是GreenDao使用的是JDT。GreenDao官方提供的是代碼開源,但是在GreenDao的GitHub只提供了greendao、greendao-api、greendao-generator這三個模塊,另外三個模塊在Gradle的cache文件夾中也是找不到源碼的,要想學習這部分源碼只能反編譯和分析來解決。
2.GreenDao頂級視圖
上圖對照著GreenDao的整體架構進行分析,繪製出來的GreenDao整體結構圖。包含GreenDao的各個組件以及開發者使用GreenDao中的註解編寫代碼,註解生成的代碼和GreenDao的配合完成程序與資料庫打交道的工作。
先從左上角的模塊開始,original-model是android開發者使用GreenDao的註解編寫代碼,編寫出最原始的model類,添加上GreenDao的註解。這時候GreenDao的使用者就初步完成了工作。再看左上角的greendao-api 註解即標準,所謂的GreenDao註解就是在這裡定義的,開發者依據greendao-api中的註解添加到的model中,GreenDao代碼生成相關模塊也是依據greendao-api中的註解來生成對應的dao代碼。到此GreenDao的代碼編寫和生成代碼邏輯似乎有一些眉目了。再來看結構圖的右上這部分模塊,greendao-gradle-plugin模塊是Gradle的插件。就是android在編譯時使用的編譯工具Gradle,別和GreenDao弄混了。使用Gradle插件的目的是每次在編譯的時候,就會有相關執行代碼的入口,GreenDao就可以在這個時機來生成代碼。提醒開發者注意的是Gradle的插件是在編譯期執行的,就意味著不會影響app代碼在用戶手機的運行效率,但是會影響apk的編譯速度。在選擇使用GreenDao的時候也要考慮這方面的因素。使用GreenDao除了官方樣例那樣全部引入以外,還有另外一種方案,就是用Demo工程去生成代碼,再將生成出來的代碼copy到主工程中使用,主工程只依賴greendao-core和greendao-api,GreenDao的Gradle插件在主工程並不使用,在Demo工程執行插件生成代碼的工作。此方法提供給大家參考和選擇。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代碼配合實現與最底下的SQLlite通訊完成資料庫相關的操作。
3.GreenDao代碼生成流程圖
以上是GreenDao相關的代碼生成的實現,下面是相關技術點的介紹,如果有對下面的技術點了解的可以跳過其中的章節。
4.Gradle 插件相關
如何開發一個gradle plugin,網上例子很多,這裡簡單列舉自定義Gradle plugin插件的步驟
1.新建module,刪除module中大部分內容。2.新建MyPlugin.groovy,實現org.gradle.api.Plugin介面,apply入口方法。3.建立resources目錄、創建.properties文件.4.配置gradle文件、上傳maven庫。5執行插件。
注意:這裡properties的名字及裡邊的配置,以及Gradle文件中的配置只有實踐嘗試了之後才能搞明白都是做什麼用的。在本篇文章的最後面有參考自定義Gradle的插件的鏈接,可以學習一下。GreenDao的Gradle插件的代碼是greendao-gradle-plugin-3.2.2.jar --> Greendao3GradlePlugin
5.Android註解相關
這部分是對註解和註解處理器做簡單的介紹,有了這些基礎才能對GreenDao中註解相關知識分析明白,以及研究明白這些代碼是怎麼串聯起來的和這些代碼是做什麼用的。如果對註解和註解處理器已經熟悉了可以直接跳過這部分介紹。
Annotation(註解)是JDK5.0及以後版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。從某些方面看,annotation就像修飾符一樣被使用,並應用於包、類 型、構造方法、方法、成員變數、參數、本地變數的聲明中。這些信息被存儲在Annotation的「name=value」結構對中。
功能作用:1.編寫文檔:通過代碼里標識的元數據生成文檔2.代碼分析:通過代碼里標識的元數據對代碼進行分析3.編譯檢查:通過代碼里標識的元數據讓編譯器能實現基本的編譯檢查
根據註解使用的方法和用途分類:1.JDK內置系統註解2.元註解3.自定義註解
元註解1.@Target 描述註解修飾的範圍, 類、介面、包、方法等類型。2.@Retention 註解被保留的時間長短3.@Document javadoc4.@Inhrited 註解類的繼承關係(註:元註解的作用就是負責註解其他註解 java 5.0定義了4個)
RetentionPoicy取值1.SOURCE:在源文件中有效(即源文件保留)2.CLASS:在class文件中有效(即class保留)3.RUNTIME:在運行時有效(即運行時保留)
GreenDao中的註解是在greendao-api-3.2.2.jar 包中定義的、全部為source級別。
開發中常見的註解處理器有反射、APT、JDT等。反射在java開發中是比較常見的、apt是android開發經常使用的方式、jdt是eclipse開發工具使用的處理器。這個在國內用的比較少。JDT的介紹是我從eclipse官網找到的,在文章最後有相關的鏈接。JDT為Eclipse中的Java 5項目添加了注釋處理支持,它提供了以下功能:支持為Sun的命令行apt工具編寫的運行注釋處理器。增量構建期間基於注釋的構建構件的貢獻。基於注釋的問題的問題標記的貢獻。
GreenDao使用的註解處理器是JDT。
6.代碼生成框架FreeMarker
FreeMarker不是什麼新技術,在java服務端的開發中已經使用好多年,基本原理就是寫一個模板,然後在模板里加入判斷和變數,支持一些基本的聲明、變數、判斷、循環等語法。將實體類已對象的形式作為參數傳遞到模板中,最後將對象的值和模板進行結合生成對應的代碼。做android的同學可以用DataBinding、MVVM來做比較學習,原理相似。FreeMarker還是比較容易學習,在本篇文章的最後有FreeMarker的入門文章鏈接。
在GreenDao中代碼生成邏輯是以DaoGenerator.generateAll()作為入口。使用FreeMarker實現的生成代碼的引擎。
生成代碼的方式有很多種,最基礎的是拼接字元串的形式實現,傳入變數去拼接,然後將字元串寫到一個文件中。還有一種生成代碼的方式叫javapoet的,使用javapoet的語法定義文件、類、方法,然後將方法放入類中,類放入文件中,是個挺有意思的框架,有感興趣的可以了解一下。當然還有FreeMarker類似的框架velocity,這些都是java模板引擎生成代碼的框架。
大家可以學習完GreenDao生成代碼之後自己去練習寫一個生成代碼的框架,已到達復用的目的,這也是高級工程師、架構設計師的基本技能手段。
7.相關參考
GreenDao github地址https://github.com/greenrobot/greenDAOGradle插件開發https://www.jianshu.com/p/d53399cd507bJDT 介紹http://www.eclipse.org/jdt/overview.php註解處理器https://blog.csdn.net/u013045971/article/details/53509237自定義註解https://blog.csdn.net/u013045971/article/details/53433874FreeMarker 快速入門https://segmentfault.com/a/1190000011768799


TAG:野生的安卓獸 |