一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

2021-03-16 01:25bugstack蟲洞棧小傅哥 Java教程

雖然市面上已經有了大量成熟穩定用于支撐系統建設的輪子,也就是服務、框架、組件、工具等,但對于一些較大型的公司來說,這些輪子可能并不一定能很好的支撐起系統需要承載的服務體量,這個時候就需要自建一些輪子。

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

目錄

  • 一、前言
  • 二、什么是腳手架呢?
  • 三、誰提供了腳手架?
    • 1、Spring 官網腳手架
    • 2、阿里云腳手架
  • 四、手擼一個腳手架!
    • 1. 工程框架
    • 2. 應用層定義生成類接口
    • 3. FTL 模板定義
    • 4. FTL 生成文件
    • 5. 創建框架入口
    • 6. 測試驗證
  • 五、源碼下載
  • 六、總結
  • 七、系列推薦

一、前言

為什么我們要去造輪子?

造輪子的核心目的,是為了解決通用共性問題的凝練和復用。

雖然市面上已經有了大量成熟穩定用于支撐系統建設的輪子,也就是服務、框架、組件、工具等,但對于一些較大型的公司來說,這些輪子可能并不一定能很好的支撐起系統需要承載的服務體量,這個時候就需要自建一些輪子。

而提倡的不重復造輪子,新造輪子不一定能保證穩定性。一般用在以官網推出的核心輪子上是適合的,比如 SpringBoot、Netty、HBase 等。但對于一些特殊場景的解決方案工具型組件,通常是沒有完全符合的輪子的,就像 SpringBoot 腳手架。

其實每個較大型的公司都會有很多同類技術服務的組件,例如 RPC、數據庫路由、注冊中心、分布式任務、MQ隊列消息等,而這時候腳手架的開發就需要適配這些組件,搭建出符合自己公司技術棧實現需要的系統架構。這不同于一些較小的互聯網公司,可以完全使用 SpringBoot 提供的一整套解決方案

另外,造輪子是個人技術沉淀、也是薪資待遇的積累!別說造不了飛機,只是你沒有提供場地!

有什么場景還能造輪子?

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

用于架構基建下的所有模塊都可以成為輪子,通常我們都是在這些場景下:負載均衡、服務網關、服務治理、框架語言、服務組件、數據承載、框架結構、部署方式、工具插件,建設需要的輪子。

其實一個較成熟的互聯網公司,大部分場景下的輪子,已基本建造完了。剩下的一般是用于解決業務場景下非業務邏輯的通用性組件,例如,高并發下的緩存熱Key、Redis 層路由、活動邀請的不唯一短碼生成,等等類似這樣的場景。但此類場景的輪子建設也是非常有價值的,在公司層面使用穩定后,還可以推廣到市場獲得一定的認可,以及更好的會被收入到 Apache 項目。

二、什么是腳手架呢?

What is scaffolding? Is it a term for a particular platform?

Scaffolding is a meta-programming method of building database-backed software applications. It is a technique supported by some model-view-controller frameworks, in which the programmer may write a specification that describes how the application database may be used. The compiler uses this specification to generate code that the application can use to create, read, update and delete database entries, effectively treating the template as a "scaffold" on which to build a more powerful application.

  • https://stackoverflow.com/questions/235018/what-is-scaffolding-is-it-a-term-for-a-particular-platform

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

結合 stackoverflow 上的回答,腳手架是一種元編程方法,用于構建基于數據的應用。創建系統架構的程序員編寫一份規格說明書,用于描述怎么去使用數據庫。而腳手架可以根據這份規則說明書生成相應的框架代碼。我們把這種模式成為腳手架,在腳手架上更高效的構建出powerful 的應用!

說白了就是簡化具有共性重復操作的簡單工作,不再需要程序員還得一點點粘貼復制,克隆出一個已經存在的架構。只需要在界面或者公用接口上,傳入必要的參數,就可以創建出一個應用開發框架。

三、誰提供了腳手架?

1、Spring 官網腳手架

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

  • 推薦:????
  • 鏈接:https://start.spring.io
  • 源碼:https://github.com/spring-io/start.spring.io
  • 描述:Spring Initializr 本質上也是一個 Web 應用,它可以通過 Web 界面、Spring Tool Suite、IntelliJ IDEA 等方式,構建出一個基本的 Spring Boot 項目結構。同時可以使用它的源碼進行本地部署

2、阿里云腳手架

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

  • 推薦:????
  • 鏈接:https://start.spring.io
  • 描述:Aliyun Java Initializr 和 Spring Initializr 是同類的 Web 服務,是代碼框架生成器,一鍵生成你的代碼框架,有完善的工具鏈,免費的IDEA插件,方便直接在IDE中生成,完善的工具鏈,免費的IDEA插件,方便直接在IDE中生成,同時也非常適合國內用戶的網絡環境。

其實,這兩個腳手架都能很好的生成項目結構,讓程序員可以在統一的標準下快速的進入開發環境。只是依賴于自身選擇的支撐服務,選擇不同的框架就可以了。

四、手擼一個腳手架!

都有腳手架了,那為什么要自己擼一個呢?

腳手架的目的是為了在統一的標準下快速建設系統框架,把系統開發過程中需要的配置、組件、服務、測試,一并通過配置引入到系統開發中。

但有些時候在互聯網公司通用的腳手架是不太合適使用的,因為它沒有把公司內的一些自研性質的組件引入進去,也不能很好的融合。如果已經用腳手架生成后還得需要研發人員自己大量復制進去一些特定的組件,就破壞了腳手架本身能力,也是破壞了準則和規范。

所以,需要結合腳手架的開發能力,包裝各類特定組件、服務、配置,實現符合公司領域的統一腳手架。

那么,本章節就帶著大家看看一個腳手架,該如何開發實現。其實并沒有太負責,我們可以使用 freemarker 的能力,構建系統框架。

1. 工程框架

EasyRiggerInitializr 

└── src 

    ├── main 

    │   ├── java 

    │   │   └── cn.bugstack.initializr.rigger 

    │   │       ├── application 

    │   │       │  └── IProjectGenerator.java 

    │   │       ├── domain 

    │   │       │  ├── model 

    │   │       │  │   └── ApplicationInfo.java      

    │   │       │  │   └── ProjectInfo.java  

    │   │       │  └── service 

    │   │       │      ├── module 

    │   │       │      │   ├── impl 

    │   │       │      │   │   ├── GenerationApplication.java 

    │   │       │      │   │   ├── GenerationIgnore.java 

    │   │       │      │   │   ├── GenerationPackageInfo.java 

    │   │       │      │   │   ├── GenerationPom.java 

    │   │       │      │   │   ├── GenerationTest.java     

    │   │       │      │   │   └── GenerationYml.java      

    │   │       │      │   └── BaseModule.java     

    │   │       │      └── ProjectGeneratorImpl.java 

    │   │       └── RiggerApplication.java 

    │   └── resources  

    │       ├── generator 

    │       │   ├── application.ftl 

    │       │   ├── ignore.ftl  

    │       │   ├── package-info.ftl  

    │       │   ├── pom.ftl  

    │       │   ├── test.ftl      

    │       │   └── yml.ftl     

    │       └── application.yml 

    └── test 

         └── java 

             └── cn.bugstack.initializr.rigger.test 

                 └── ApiTest.java 

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

整個用于創建腳手架的工程并不復雜,主要就是通過 freemarker 對各類定義的 ftl 模板文件,生成對應的系統框架結構。這里包括:工程主體、框架結構、啟動類、配置文件、測試類等,也可以結合自身需求把對應 ORM 的類和映射關系生成出來。

整個工程結構偏 DDD 層次結構,domain 領域中建設了所有的生成方式,resources/generator 定義生成模板,其他地方就沒有太大的差異了。

接下來簡單介紹下這個工程的代碼,讓大家可以理解這樣的工程是如何開發的,也可以通過這樣工程繼續完善成自己需要的結構。

2. 應用層定義生成類接口

  • cn.bugstack.initializr.rigger.application.IProjectGenerator.java

public interface IProjectGenerator { 

 

    void generator(ProjectInfo projectInfo) throws Exception; 

 

DDD 的分層結構,通常都會在 application 這個比較薄的層定義接口,再有 domain 領域層做相應的實現。

這個接口的定義主要是為了,讓外部調用方可以通過此接口創建工程框架。

3. FTL 模板定義

什么是 FreeMarker?

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

FreeMarker 是一款 模板引擎:即一種基于模板和要改變的數據, 并用來生成輸出文本(HTML網頁,電子郵件,配置文件,源代碼等)的通用工具。它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。

模板編寫為FreeMarker Template Language (FTL)。它是簡單的,專用的語言, 不是 像PHP那樣成熟的編程語言。那就意味著要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算, 之后模板顯示已經準備好的數據。在模板中,你可以專注于如何展現數據, 而在模板之外可以專注于要展示什么數據。

FreeMarker 在線手冊:http://freemarker.foofun.cn

3.1 application.ftl

package ${packageName}; 

 

import org.springframework.boot.SpringApplication; 

import org.springframework.boot.autoconfigure.SpringBootApplication; 

 

@SpringBootApplication 

public class ${className} { 

 

    public static void main(String[] args) { 

        SpringApplication.run(${className}.class, args); 

    } 

 

3.2 pom.ftl

<?xml version="1.0" encoding="UTF-8"?> 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

    <modelVersion>4.0.0</modelVersion> 

    <parent> 

        <groupId>org.springframework.boot</groupId> 

        <artifactId>spring-boot-starter-parent</artifactId> 

        <version>2.1.6.RELEASE</version> 

        <relativePath/> <!-- lookup parent from repository --> 

    </parent> 

    <groupId>${groupId}</groupId> 

    <artifactId>${artifactId}</artifactId> 

    <version>${version}</version> 

    <name>${name}</name

    <description>${description}</description> 

     

</project> 

3.3 yml.ftl

  • server: 
  •   port: 8081 

以上,只是用于生成框架文件的基礎 ftl 文件,有需要一些特殊判斷和邏輯的,可以參考FreeMarker 在線手冊,編寫自己需要的 ftl 文件。

4. 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,這三方面。

5. 創建框架入口

cn.bugstack.initializr.rigger.domain.service.ProjectGeneratorImpl.java

@Service 

public class ProjectGeneratorImpl implements IProjectGenerator { 

 

    private Logger logger = LoggerFactory.getLogger(ProjectGeneratorImpl.class); 

 

    @Resource 

    private GenerationApplication generationApplication; 

    @Resource 

    private GenerationYml generationYml; 

    @Resource 

    private GenerationPom generationPom; 

    @Resource 

    private GenerationTest generationTest; 

    @Resource 

    private GenerationIgnore generationIgnore; 

    @Resource 

    private GenerationPackageInfo generationPackageInfo; 

 

    @Override 

    public void generator(ProjectInfo projectInfo) throws Exception { 

 

        URL resource = this.getClass().getResource("/"); 

        String projectsRoot = resource.getFile() + "/projects/"

 

        String lastPackageName = projectInfo.getArtifactId().replaceAll("-""").toLowerCase(); 

        //啟動類名稱 

        String[] split = projectInfo.getArtifactId().split("-"); 

        StringBuffer applicationJavaName = new StringBuffer(); 

        Arrays.asList(split).forEach(s -> { 

            applicationJavaName.append(s.substring(0, 1).toUpperCase() + s.substring(1)); 

        }); 

        applicationJavaName.append("Application"); 

 

        // 1. 創建  Application.java 

        generationApplication.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 

 

        // 2. 生成 application.yml 

        generationYml.doGeneration(projectInfo, projectsRoot); 

 

        // 3. 生成 pom.xml 

        generationPom.doGeneration(projectInfo, projectsRoot); 

 

        // 4. 創建測試類 ApiTest.java 

        generationTest.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 

 

        // 5. 生成 .gitignore 

        generationIgnore.doGeneration(projectInfo, projectsRoot); 

 

        // 6. DDD 四層描述文件 

        generationPackageInfo.doGeneration(projectInfo, projectsRoot, lastPackageName, applicationJavaName); 

 

    } 

 

ProjectGeneratorImpl 類,就是應用層接口 IProjectGenerator 在領域層的具體實現。這里包括了如下內容:

  • 創建 Application.java
  • 生成 application.yml
  • 生成 pom.xml
  • 創建測試類 ApiTest.java
  • 生成 .gitignore
  • DDD 四層描述文件

綜上,就是整個腳手架生成的簡要介紹,其實并沒有多復雜,主要就是 ftl 文件的定義和使用,這種創建腳手架的方式還是很方便的。

6. 測試驗證

單元測試@Testpublic void test_IProjectGenerator() throws Exception { ProjectInfo projectInfo = new ProjectInfo( "cn.bugstack.demo", "web-test", "1.0.0-SNAPSHOT", "web-test", "Demo project for Spring Boot" ); iProjectGenerator.generator(projectInfo);}

測試結果

 

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

腳手架把創建出來的工程生成到 test-classes 下,這個路徑也可以配置到其他路徑里。

有了新生成的工程就可以通過 IDEA 打開了,與我們手動創建的工程是一樣的。

五、源碼下載

不重復造輪子都是騙小孩的,教你手擼 SpringBoot 腳手架!

  • 源碼下載:關注公眾號:bugstack蟲洞棧,回復:腳手架
  • 項目介紹:SpringBoot 腳手架,簡化項目構建。目前的項目工程還比較簡單,非常適合新人學習使用。后續我們會在這個版本的基礎上陸續完善一些功能,把RPC、MQ、注冊中心、網關、等各類組件融合進來,方便選擇性的構建和擴展。

六、總結

  • 站在公司角度不重復造輪子是為了各部門職責和資源的成本,但對個人來說,不能因為一句不重復造輪子,就放棄了對知識棧深入學習的機會。
  • 沒有這些根基的學習,也壓根不會理解技術的遷移、服務的提取、組件的凝練。反反復復的總是做一些 API 的應用包殼,對個人技術上也就沒有什么成長。
  • 最后說回來,哪怕公司不需要你造輪子,沒關系,你可以造給自己,可以分享到 Github 社區。一方面是自己的學習匯總,另一方面也是對技術的沉淀和貢獻。

原文地址:https://mp.weixin.qq.com/s/8nZnAPetPwiMtqMRj-2STw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费a视频在线观看 | 猫咪免费人成网站在线观看入口 | 亚洲欧美激情日韩在线 | 精品国产精品国产偷麻豆 | 国产黑丝一区 | 九九精品视频在线观看九九 | 边吃胸边膜下刺激免费男对女 | 忘忧草研究院一二三 | bl双性受乖调教改造身体 | 亚洲六月丁香婷婷综合 | 美女认你摸 | 波多野结衣伦理在线观看 | 甜性涩爱| 973影院| 亚飞与亚基高清国语在线观看 | 香蕉精品国产高清自在自线 | 久久99re2在线视频精品 | java hd国产高清 | 激情涩涩 | 日韩夫妻性生活 | 天天翘 | 传说之下羊妈挤羊奶网站 | 韩国最新三级网站在线播放 | 狠狠色婷婷 | 波多野结中文字幕在线69视频 | 99小视频 | 熟睡中的麻麻大白屁股小说 | 99er热| 亚洲qvod图片区电影 | 免费在线观看a | 欧美xxxxx69 | 亚洲国产综合久久久无码色伦 | 亚洲天堂视频在线免费观看 | 操大肥b| 免费一区二区视频 | 青草久久网 | 日本漫画大全之工之口 | www日本在线观看 | 亚洲国产成人精品不卡青青草原 | 国产老肥熟xxxx | 国产hd老头老太婆 |