java代码自动生成的插件_如何使用插件生成自定义Java 8代码
java代碼自動(dòng)生成的插件
大多數(shù)程序員討厭的一件事就是編寫樣板代碼。 無休止的時(shí)間花費(fèi)在設(shè)置實(shí)體類和配置數(shù)據(jù)庫連接上。 為了避免這種情況,您可以讓Speedment Open Source之類的程序?yàn)槟伤羞@些代碼。 這樣可以很容易地以最少的人工就可以啟動(dòng)和運(yùn)行數(shù)據(jù)庫項(xiàng)目,但是當(dāng)將大部分代碼移交給機(jī)器時(shí),如何保持對(duì)編寫代碼的控制?
假設(shè)您有一個(gè)數(shù)據(jù)庫,該數(shù)據(jù)庫的表“ user”具有“ gender”列,并且您希望將其實(shí)現(xiàn)為java中的枚舉。 如果運(yùn)行Speedment并將其用于生成代碼,則“性別”字段將表示為字符串。 這樣做的原因是,沒有任何內(nèi)置映射器可在數(shù)據(jù)庫ENUM和自定義Java類之間進(jìn)行轉(zhuǎn)換。 這是您可能會(huì)覺得發(fā)電機(jī)正在為您控制的情況之一。 好吧,不用擔(dān)心,因?yàn)閺?.3 Hamilton版本開始 ,您可以通過為Speedment創(chuàng)建自己的插件來獲得相同的控件!
本文的目標(biāo)
在此示例中,我們有一個(gè)數(shù)據(jù)庫架構(gòu),其中包含一個(gè)名為“ Person”的表。 一個(gè)人有一個(gè)ID,一個(gè)名字和一個(gè)性別。 性別被聲明為帶有三個(gè)可能值的ENUM:“男性”,“女性”和“其他”。 如果我們使用Speedment中的默認(rèn)設(shè)置來生成此類,Speedment將把ENUM視為字符串。 但是有一些問題。 例如,如果要將新人員保留在數(shù)據(jù)庫中,則沒有什么可以阻止您在插入時(shí)將性別拼寫錯(cuò)誤并獲得異常。 取而代之的是,我們想使用指定的替代方法將java枚舉定義為常量。 是什么使生成的代碼更安全且更易于使用。
我們可以使用Speedment插件來實(shí)現(xiàn)這一目標(biāo)!
創(chuàng)建插件項(xiàng)目
要對(duì)Speedment平臺(tái)進(jìn)行任何自定義修改,我們將需要定義一個(gè)插件。 插件是一款軟件,可以從pom.xml文件插入Speedment運(yùn)行時(shí)。 該插件位于其自己的Maven項(xiàng)目中,并且可以在項(xiàng)目之間共享。
首先創(chuàng)建一個(gè)新的Maven項(xiàng)目,然后將Speedment聲明為依賴項(xiàng)。 在此項(xiàng)目中,您不需要speedment-maven-plugin。
<dependency><groupId>com.speedment</groupId><artifactId>speedment</artifactId><version>${speedment.version}</version> </dependency>插件系統(tǒng)圍繞兩個(gè)界面旋轉(zhuǎn)。 Component和ComponentConstructor。 組件是可插入的軟件,可以在Speedment生命周期中執(zhí)行。 每個(gè)組件都具有允許執(zhí)行的多個(gè)階段。 這些是“初始化”,“加載”,“解析”和“開始”。
ComponentConstructor是一種輕型類型,具有默認(rèn)構(gòu)造函數(shù)和用于初始化自定義組件新實(shí)例的方法。 maven插件使用它來設(shè)置新代碼。
這是我們的兩種實(shí)現(xiàn)的外觀:
CustomMappingComponent.java
public final class CustomMappingComponent extends AbstractComponent {CustomMappingComponent(Speedment speedment) {super(speedment);}@Overridepublic void onResolve() {// Resolve logic here...}@Overridepublic Class<CustomMappingComponent> getComponentClass() {return CustomMappingComponent.class;}@Overridepublic Software asSoftware() {return AbstractSoftware.with("Custom Mapping Component", "1.0", APACHE_2);}@Overridepublic Component defaultCopy(Speedment speedment) {return new CustomMappingComponent(speedment);} }CustomMappingComponentInstaller.java
public final class CustomMappingComponentInstaller implements ComponentConstructor<CustomMappingComponent> {@Overridepublic Component create(Speedment speedment) {return new CustomMappingComponent(speedment);} }現(xiàn)在,我們有了一個(gè)準(zhǔn)插件,可以將其添加到Speedment項(xiàng)目中。 下一步是定義在字符串和性別之間映射的邏輯。 為此,首先我們需要性別枚舉。
Gender.java
public enum Gender {MALE ("Male"), FEMALE ("Female"),OTHER ("Other");private final String databaseName;Gender(String databaseName) {this.databaseName = databaseName;}public String getDatabaseName() {return databaseName;} }如果將枚舉值以大寫形式存儲(chǔ)在數(shù)據(jù)庫中,則該類可能會(huì)短得多,因?yàn)槟梢院?jiǎn)單地使用Enum.name()方法來獲取數(shù)據(jù)庫名稱,但是如果您希望靈活地命名,則此方法更好常數(shù)。
現(xiàn)在到最后一塊。 我們需要在Speedment中聲明一個(gè)實(shí)現(xiàn)TypeMapper接口的類型。 類型映射器確實(shí)很簡(jiǎn)單。 它包含兩種用于映射到數(shù)據(jù)庫類型或從數(shù)據(jù)庫類型映射的方法,以及用于檢索兩種類型的Java類的方法。
StringToGenderMapper.java
public final class StringToGenderMapper implements TypeMapper<String, Gender> {@Overridepublic Class<Gender> getJavaType() {return Gender.class;}@Overridepublic Class<String> getDatabaseType() {return String.class;}@Overridepublic Gender toJavaType(String value) {if (value == null) {return null;} else {return Stream.of(Gender.values()).filter(g -> g.getDatabaseName().equals(value)).findAny().orElseThrow(() -> new UnsupportedOperationException("Unknown gender '" + value + "'."));}}@Overridepublic String toDatabaseType(Gender value) {if (value == null) return null;else return value.getDatabaseName();}@Overridepublic boolean isIdentityMapper() {return false;} }此新的映射器也需要安裝在Speedment平臺(tái)中。 我們可以通過修改onResolve()方法從前面創(chuàng)建的組件中執(zhí)行此操作:
CustomMappingComponent.java
@Override public void onResolve() {// Resolve logic here...getSpeedment().getTypeMapperComponent().install(StringToGenderMapper::new); }我們的新插件現(xiàn)已完成! 構(gòu)建項(xiàng)目,您就可以開始了!
使用插件
要在項(xiàng)目中使用插件,只需修改該項(xiàng)目的pom.xml文件。 打開一個(gè)現(xiàn)有的Speedment項(xiàng)目并找到pom.xml文件。 在其中,您應(yīng)該能夠找到speedment-maven-plugin。 為了使您自己的插件可供Maven插件訪問,您需要將其作為依賴項(xiàng)添加到<plugin> -tag內(nèi),并將ComponentInstaller添加到配置中。 這是它的外觀示例:
pom.xml
<plugin><groupId>com.speedment</groupId><artifactId>speedment-maven-plugin</artifactId><version>${speedment.version}</version><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Our plugin project --><dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency></dependencies><configuration><components><!-- Path to the component installer --><component implementation=" com.github.pyknic.salesinfo.plugin.CustomMappingComponentInstaller" /></components></configuration> </plugin>您還需要將項(xiàng)目添加為運(yùn)行時(shí)依賴項(xiàng),因?yàn)楸仨毧梢詮纳傻拇a訪問新的Gender枚舉。
<dependencies>...<dependency><groupId>com.github.pyknic</groupId><artifactId>custom-mapping-component</artifactId><version>1.0.0-SNAPSHOT</version></dependency>... </dependencies>嘗試一下
而已! 插件已安裝! 如果要將特定的列映射到性別而不是字符串,則可以進(jìn)入用戶界面,導(dǎo)航到“項(xiàng)目樹”中的特定列,然后在下拉列表中選擇新的類型映射器。
如果要查看加載到平臺(tái)中的所有組件和/或類型映射器的列表,還可以在UI中轉(zhuǎn)到“關(guān)于”→“組件...”。 在那里您應(yīng)該看到新的組件。
摘要
在本文中,您學(xué)習(xí)了如何為Speedment創(chuàng)建自定義插件,該插件將新的Type Mapper從String集成到Gender枚舉。 您還了解了如何查看將哪些組件加載到平臺(tái)中以及如何選擇要用于每一列的類型映射器。
PS:如果您為Speedment項(xiàng)目創(chuàng)建了一些很棒的新映射器,請(qǐng)考慮在我們的Gitter聊天中與社區(qū)共享它們!
翻譯自: https://www.javacodegeeks.com/2016/04/generate-customized-java-8-code-plugins.html
java代碼自動(dòng)生成的插件
總結(jié)
以上是生活随笔為你收集整理的java代码自动生成的插件_如何使用插件生成自定义Java 8代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的for语句(linux中fo
- 下一篇: java美元兑换,(Java实现) 美元