什么是腳手架?
腳手架是一種元編程方法,用於構建基於數據的應用。創建系統架構的程序員編寫一份規格說明書,用於描述怎么去使用數據庫。而腳手架可以根據這份規則說明書生成相應的框架代碼。我們把這種模式稱為腳手架,在腳手架上更高效的構建出 powerful 的應用!
說白了就是簡化具有共性重復操作的簡單工作,不再需要程序員還得一點點粘貼復制,克隆出一個已經存在的架構。只需要在界面或者公用接口上,傳入必要的參數,就可以創建出一個應用開發框架。
針對Springboot初學者,我分享一套SpringBoot教程,通過這個視頻的學習,可以全面掌握Spring Boot開發框架技術,並在實際項目開發中得心應手使用Spring Boot框架,提升自身的技術能力與價值。
在線觀看:
急速開發框架SpringBoot 2.X版-springboot核心思想
資料免費下載:
前言
腳手架的目的是為了在統一的標准下快速建設系統框架,把系統開發過程中需要的配置、組件、服務、測試,一並通過配置引入到系統開發中。
但有些時候在互聯網公司通用的腳手架是不太合適使用的,因為它沒有把公司內的一些自研性質的組件引入進去,也不能很好的融合。如果已經用腳手架生成后還得需要研發人員自己大量復制進去一些特定的組件,就破壞了腳手架本身能力,也是破壞了准則和規范。
所以,需要結合腳手架的開發能力,包裝各類特定組件、服務、配置,實現符合公司領域的統一腳手架。
那么,本文章就帶着大家看看一個腳手架,該如何開發實現。其實並沒有太復雜,我們可以使用 freemarker 的能力,構建系統框架。
一、工程框架


整個用於創建腳手架的工程並不復雜,主要就是通過 freemarker 對各類定義的 ftl 模板文件,生成對應的系統框架結構。這里包括:工程主體、框架結構、啟動類、配置文件、測試類等,也可以結合自身需求把對應 ORM 的類和映射關系生成出來。
整個工程結構偏 DDD 層次結構,domain 領域中建設了所有的生成方式,resources/generator 定義生成模板,其他地方就沒有太大的差異了。
接下來簡單介紹下這個工程的代碼,讓大家可以理解這樣的工程是如何開發的,也可以通過這樣工程繼續完善成自己需要的結構。
二、應用層定義生成類接口
cn.bugstack.initializr.rigger.application.IProjectGenerator.java

- DDD 的分層結構,通常都會在 application 這個比較薄的層定義接口,再有 domain 領域層做相應的實現。
- 這個接口的定義主要是為了,讓外部調用方可以通過此接口創建工程框架。
三、FTL 模板定義
FreeMarker:

FreeMarker 是一款 模板引擎:即一種基於模板和要改變的數據, 並用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。那就意味着要准備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算, 之后模板顯示已經准備好的數據。在模板中,你可以專注於如何展現數據, 而在模板之外可以專注於要展示什么數據。
FreeMarker 在線手冊:http://freemarker.foofun.cn
1 、application.ftl

2 、pom.ftl

3 、yml.ftl

以上,只是用於生成框架文件的基礎 ftl 文件,有需要一些特殊判斷和邏輯的,可以參考FreeMarker 在線手冊,編寫自己需要的 ftl 文件。
四、FTL 生成文件
cn.bugstack.initializr.rigger.domain.service.module.impl.GenerationApplication.java @Service public class GenerationApplication extends BaseModule { private Logger logger = LoggerFactory.getLogger(GenerationApplication.class); public void doGeneration(ProjectInfo projectInfo, String projectsRoot, String lastPackageName, StringBuffer applicationJavaName) throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo( projectInfo.getGroupId() + "." + lastPackageName, applicationJavaName.toString() ); String packagePath = applicationInfo.getPackageName().replace(".", "/") + "/"; File file = new File(projectsRoot + projectInfo.getArtifactId() + "/src/main/java/" + packagePath, applicationInfo.getClassName() + ".java"); // 寫入文件 super.writeFile(file, "application.ftl", applicationInfo); logger.info("創建主入口類 Application.java {}", file.getPath()); } }
- 關於 ftl 文件的使用,無論在用於生成那一層的文件,基本都是通用。這里只展示一下關於 Application.java 的創建。
- 主要包括了,定義入參
ApplicationInfo、定義文件位置/src/main/java/、以及寫入到文件super.writeFile,這三方面。
五、創建框架入口
cn.bugstack.initializr.rigger.domain.service.ProjectGeneratorImpl.java

ProjectGeneratorImpl 類,就是應用層接口 IProjectGenerator 在領域層的具體實現。這里包括了如下內容:
- 創建 Application.java
- 生成 application.yml
- 生成 pom.xml
- 創建測試類 ApiTest.java
- 生成 .gitignore
- DDD 四層描述文件
綜上,就是整個腳手架生成的簡要介紹,其實並沒有多復雜,主要就是 ftl 文件的定義和使用,這種創建腳手架的方式還是很方便的。
六、測試驗證
單元測試

測試結果

轉載自作者:小傅哥
博客:https://bugstack.cn
