0228 我的潘多拉

我的潘多拉
從一個(gè)故事說(shuō)起。
從前,有個(gè)Java程序員非常喜歡寫(xiě)程序,喜歡研究源碼,讀英文文檔。但是它在一家小公司里工作,公司的技術(shù)棧很陳舊。
單個(gè)系統(tǒng)代碼中含有很多的xml配置,配置各種中間件的入口適配器,而不同的業(yè)務(wù)系統(tǒng)中都是類(lèi)似的配置。
啟動(dòng)單個(gè)系統(tǒng)很慢。
啟動(dòng)依賴(lài)web組件,無(wú)法快速部署。
公共組件的依賴(lài)復(fù)雜,容易依賴(lài)沖突,版本陳舊。
在springcloud流行的時(shí)代,無(wú)法快速集成新的優(yōu)秀組件。
而且,團(tuán)隊(duì)統(tǒng)一使用類(lèi)似的項(xiàng)目模板,maven多模塊,更換的阻力大。
使用統(tǒng)一項(xiàng)目模板可以更好的規(guī)范團(tuán)隊(duì)的代碼結(jié)構(gòu),遵守公共的公共組件規(guī)約,減少了不同的工程師維護(hù)代碼的成本。
現(xiàn)實(shí)很殘酷,我愛(ài)springboot。
springboot不是新的東西,官網(wǎng)寫(xiě)的目標(biāo)很強(qiáng)大:build everything ;
可以很好的對(duì)癥下藥,用了之后應(yīng)該會(huì)神清氣爽。
springboot提倡零xml,使用java config的模式取代配置代碼,通過(guò)代碼的方式,就有可能消除重復(fù)的配置。
springboot的啟動(dòng)速度很快,看了部分源碼,有部分異步啟動(dòng)裝配組件。
springboot為快速部署而生,內(nèi)置了web容器無(wú)需配置tomcat.
springboot可以使用starter的方式使用公共組件,而且很好的解決了依賴(lài)沖突。
springboot積累了大量的最佳實(shí)踐,為springcloud和各種大的云廠商提供很好的很好的支持。
而springcloud提供了成熟配套的微服務(wù)組件,技術(shù)更先進(jìn),在行業(yè)的通用性更強(qiáng)。
那么如何在熱愛(ài)新技術(shù)跟現(xiàn)實(shí)的成就的工作中找到一條兩全其美的高速公路呢?
如何打開(kāi)上圖中的潘多拉魔盒,連接現(xiàn)實(shí)與夢(mèng)想。
簡(jiǎn)單直接:
直接把項(xiàng)目骨架改成基于springboot結(jié)構(gòu)的就可以了;
團(tuán)隊(duì)習(xí)慣多模塊,那就改造成多模塊的,發(fā)布模塊改為springboot就好了;
團(tuán)隊(duì)封裝了很多公共組件,接著用,加個(gè)適配器改造成springbootstarter核心代碼不變,使用xml接著配置也行,咱兼容并包。
剩下的事情就交給springboot,各種最佳實(shí)踐,各種好用的組件,拿來(lái)就用,955不是夢(mèng),多點(diǎn)時(shí)間健身,多點(diǎn)時(shí)間陪家人。
擴(kuò)大自己的技術(shù)影響力,讓更多的小伙伴使用,出任CTO, 改善生活也不是夢(mèng)。
改造springboot
阿里巴巴的java編程規(guī)范大行其道,三層模型流行已久。

分層對(duì)應(yīng)maven的模塊,簡(jiǎn)單畫(huà)了一下層跟模塊的對(duì)應(yīng)關(guān)系圖。

原來(lái)的骨架結(jié)構(gòu)如下圖。
rest模塊的包約定如下:
按照springboot的最佳實(shí)踐,所有需要spring自動(dòng)掃描的類(lèi)放在xxxApplication類(lèi)的同級(jí)或者下級(jí)目錄中;

dal的包約定:

配置好mybatis的generator,可以方便生成持久層代碼;
代碼我也貼出來(lái)!
Archetype封裝
achetype的流程:

開(kāi)始流程前,先查閱一下maven的archetype的使用文檔。上圖是我閱讀官網(wǎng)的文檔之后畫(huà)的流程圖。下面來(lái)一步一步實(shí)現(xiàn)。
必須資源見(jiàn)紅框:

1 新建項(xiàng)目
沒(méi)什么好說(shuō)的,直接使用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>
要點(diǎn)強(qiáng)調(diào)一下:
1 配置擴(kuò)展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的規(guī)約如下:
基本結(jié)構(gòu)如下圖,英文還比較好理解。

節(jié)點(diǎn)里面的元素,看鏈接,不難。
4 配置模板資源
這里說(shuō)明一下變量。
_ rootArtifactId 路徑占位符_
\({rootArtifactId} 文件占位符<br />\){package} 包名占位符

5 安裝到本地
mvn clean install
6 本地使用


整理到團(tuán)隊(duì),推廣一下這個(gè)骨架,然后不斷整理已有的中間件到這個(gè)骨架中迭代。
早日打開(kāi)我的潘多拉。
骨架代碼點(diǎn)我獲取!
原創(chuàng)不易,轉(zhuǎn)載請(qǐng)注明出處。

浙公網(wǎng)安備 33010602011771號(hào)