我的潘多拉 從一個故事說起。從前,有個Java程式員非常喜歡寫程式,喜歡研究源碼,讀英文文檔。但是它在一家小公司里工作,公司的技術棧很陳舊。 單個系統代碼中含有很多的xml配置,配置各種中間件的入口適配器,而不同的業務系統中都是類似的配置。啟動單個系統很慢。啟動依賴web組件,無法快速部署。公共組件 ...
我的潘多拉
從一個故事說起。
從前,有個Java程式員非常喜歡寫程式,喜歡研究源碼,讀英文文檔。但是它在一家小公司里工作,公司的技術棧很陳舊。
單個系統代碼中含有很多的xml配置,配置各種中間件的入口適配器,而不同的業務系統中都是類似的配置。
啟動單個系統很慢。
啟動依賴web組件,無法快速部署。
公共組件的依賴複雜,容易依賴衝突,版本陳舊。
在springcloud流行的時代,無法快速集成新的優秀組件。
而且,團隊統一使用類似的項目模板,maven多模塊,更換的阻力大。
使用統一項目模板可以更好的規範團隊的代碼結構,遵守公共的公共組件規約,減少了不同的工程師維護代碼的成本。
現實很殘酷,我愛springboot。
springboot不是新的東西,官網寫的目標很強大:build everything ;
可以很好的對症下藥,用了之後應該會神清氣爽。
springboot提倡零xml,使用java config的模式取代配置代碼,通過代碼的方式,就有可能消除重覆的配置。
springboot的啟動速度很快,看了部分源碼,有部分非同步啟動裝配組件。
springboot為快速部署而生,內置了web容器無需配置tomcat.
springboot可以使用starter的方式使用公共組件,而且很好的解決了依賴衝突。
springboot積累了大量的最佳實踐,為springcloud和各種大的雲廠商提供很好的很好的支持。
而springcloud提供了成熟配套的微服務組件,技術更先進,在行業的通用性更強。
那麼如何在熱愛新技術跟現實的成就的工作中找到一條兩全其美的高速公路呢?
如何打開上圖中的潘多拉魔盒,連接現實與夢想。
簡單直接:
直接把項目骨架改成基於springboot結構的就可以了;
團隊習慣多模塊,那就改造成多模塊的,發佈模塊改為springboot就好了;
團隊封裝了很多公共組件,接著用,加個適配器改造成springbootstarter核心代碼不變,使用xml接著配置也行,咱相容並包。
剩下的事情就交給springboot,各種最佳實踐,各種好用的組件,拿來就用,955不是夢,多點時間健身,多點時間陪家人。
擴大自己的技術影響力,讓更多的小伙伴使用,出任CTO, 改善生活也不是夢。
改造springboot
阿裡巴巴的java編程規範大行其道,三層模型流行已久。
分層對應maven的模塊,簡單畫了一下層跟模塊的對應關係圖。
原來的骨架結構如下圖。
rest模塊的包約定如下:
按照springboot的最佳實踐,所有需要spring自動掃描的類放在xxxApplication類的同級或者下級目錄中;
dal的包約定:
配置好mybatis的generator,可以方便生成持久層代碼;
代碼我也貼出來!
Archetype封裝
achetype的流程:
開始流程前,先查閱一下maven的archetype的使用文檔。上圖是我閱讀官網的文檔之後畫的流程圖。下麵來一步一步實現。
必須資源見紅框:
1 新建項目
沒什麼好說的,直接使用maven提供的quickstart走起,刪掉java代碼。
清理好pom.xml,只保留mgav
2 配置pom的插件
<?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>
<groupId>com.springbootpractice.demo</groupId>
<artifactId>archetypes-springboot</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>3.1.1</version>
</extension>
</extensions>
</build>
</project>
要點強調一下:
1 配置擴展archetype-packaging;
3 配置archetype-metadata
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor
xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0
http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="springboot-multi-module">
<requiredProperties>
<requiredProperty key="groupId">
<defaultValue>com.leshiguang.industry.study</defaultValue>
</requiredProperty>
<requiredProperty key="artifactId">
<defaultValue>demo-services</defaultValue>
</requiredProperty>
<requiredProperty key="package">
<defaultValue>com.leshiguang.industry.study.demo</defaultValue>
</requiredProperty>
<requiredProperty key="version">
<defaultValue>1.0-SNAPSHOT</defaultValue>
</requiredProperty>
<requiredProperty key="projectAuthor">
<defaultValue>fuchun.li</defaultValue>
</requiredProperty>
</requiredProperties>
<fileSets>
<fileSet filtered="true" encoding="UTF-8">
<directory/>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
<modules>
<module id="${rootArtifactId}-api" dir="__rootArtifactId__-api" name="${rootArtifactId}-api">
<fileSets>
<fileSet filtered="true" encoding="UTF-8" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory/>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
</module>
<module id="${rootArtifactId}-dal" dir="__rootArtifactId__-dal" name="${rootArtifactId}-dal">
<fileSets>
<fileSet filtered="true" encoding="UTF-8" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>generateConfig.xml</include>
<include>mapper/*.*</include>
</includes>
<excludes>
<exclude>comment.ftl</exclude>
</excludes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
</module>
<module id="${rootArtifactId}-biz" dir="__rootArtifactId__-biz" name="${rootArtifactId}-biz">
<fileSets>
<fileSet filtered="true" encoding="UTF-8" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
</module>
<module id="${rootArtifactId}-rest" dir="__rootArtifactId__-rest" name="${rootArtifactId}-rest">
<fileSets>
<fileSet filtered="true" encoding="UTF-8" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/test/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
</module>
<module id="${rootArtifactId}-soa" dir="__rootArtifactId__-soa" name="${rootArtifactId}-soa">
<fileSets>
<fileSet filtered="true" encoding="UTF-8" packaged="true">
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/test/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8" packaged="false">
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</fileSet>
<fileSet filtered="true" encoding="UTF-8">
<directory></directory>
<includes>
<include>pom.xml</include>
<include>.gitignore</include>
<include>README.MD</include>
</includes>
</fileSet>
</fileSets>
</module>
</modules>
</archetype-descriptor>
xml的規約如下:
基本結構如下圖,英文還比較好理解。
節點裡面的元素,看鏈接,不難。
4 配置模板資源
這裡說明一下變數。
_ rootArtifactId 路徑占位符_
\({rootArtifactId} 文件占位符<br />\){package} 包名占位符
5 安裝到本地
mvn clean install
6 本地使用
整理到團隊,推廣一下這個骨架,然後不斷整理已有的中間件到這個骨架中迭代。
早日打開我的潘多拉。
骨架代碼點我獲取!
原創不易,轉載請註明出處。