From b4f9f0f018cbd5e4c009b7a974fb4c6d85bce7eb Mon Sep 17 00:00:00 2001 From: Firok Date: Fri, 5 Nov 2021 17:17:41 +0800 Subject: [PATCH] 17.1.1 --- pom.xml | 2 +- readme.md | 54 +++++++++++++++---- .../firok/spring/mvci/MVCIntrospective.java | 32 +++++++++++ .../spring/mvci/internal/BeanContext.java | 8 +-- .../spring/mvci/internal/RegexPipeline.java | 14 +---- 5 files changed, 82 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index 6785cdc..795d955 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ firok.spring mvci - 17.1.0 + 17.1.1 An annotation processing tool to generate MVC code from JavaBean(s). diff --git a/readme.md b/readme.md index 69b9277..6c79a0b 100644 --- a/readme.md +++ b/readme.md @@ -4,7 +4,7 @@ 为 SpringBoot 生成一整套 MVC CRUD 结构. (包含 mapper, service, service impl, controller) -[Readme - English](readme-en.md) +[Readme - English](readme-en.md) (尚未更新至17.1.x) ## 使用方式 @@ -14,21 +14,33 @@ ```text firok.spring.mvci.MVCIntrospectProcessor ``` -* 启用开发环境中的 ADT 功能 -* 为数据库表创建对应的 JavaBean 实体类, 并标注 `@BeanIntrospective` 注解 +* 启用开发环境中的 ADT 功能, 这通常需要在 IDE 中进行配置 +* 为数据库表创建对应的 JavaBean 实体类, 并在 **合适位置** 标注 `@MVCIntrospective` 注解 * 重新编译并启动项目 -### 自定义生成模板 +### 配置与调整生成 -修改 `@MVCIntrospective` 注解中的 `xxxTemplate` 值即可调整相关结构的生成模板 +`@MVCIntrospective` 有多个字段可供配置, 各字段配置含义在 [Javadoc 中](/src/main/java/firok/spring/mvci/MVCIntrospective.java) 有详细描述. -> 将值设为 `firok.spring.mvci.Constants.DISABLE` (`"##DISABLE##"`) 会禁用相关结构生成 +大部分字段标注了 `@AvailableValues`注解, 这描述了相关字段可接受的值. +如果 `@AvailableValues` 中包含 `Constants.CUSTOM`, 则表示此字段可以提供任意自定义值 (一般是自定义模板字符串); +否则只能为此字段提供预设值之一, 提供其它值会使得代码无法通过编译. -> 如果不想重复写多次冗长的生成模板, 可以将模板字符串定义为静态常量, 再在注解中使用 +预设值中的 `PREFER_XXX` 表示此值可以被上层配置值覆盖, 否则使用指定值; +`DEFAULT` 值则表示此字段强制使用 MVCI 给定的默认值 (一般是默认模板). -默认的模板定义在 `firok.spring.mvci.internal.DefaultXXXTemplate` 下. +`@MVCIntrospective` 可以标注到 **实体类** 或 **包** 上. +生成一个实体时, 会按照从子包到父包的顺序, 依次向上寻找有无 **包级** 配置注解, 最后决定每个配置字段的值. -创建自定义模板时, 如下键会在结构生成时被替换: +> 希望你知道 `package-info.java` 这玩意 + +### 生成模板的替换键 + +修改 `@MVCIntrospective` 注解中的 `templateXXX` 值即可调整相关的生成模板. + +默认的模板存放在 `resources` 目录下. + +根据模板生成内容时, 如下键会被替换: 键|含义|示例替换值 -|-|- @@ -44,9 +56,21 @@ `##SERVICE_IMPL_PACKAGE##` | Service Impl 位置 | `firok.spring.demo.service.impl` `##CONTROLLER_PACKAGE##` | Controller 位置 | `firok.spring.demo.controller` -### 自定义生成位置和名称 +虽然大部分 **替换键** 的 **替换值** 也是根据模板生成的, 但我们不对生成相关 **替换值** 的顺序做任何保证, 在调整这些 **替换键模板** 时请 **不要** 使用除了 `##BEAN_NAME_FULL##`, `##BEAN_NAME_SHORT##` 和 `##BEAN_PACKAGE##` 之外的 **替换键**. + +生成各 `##XXX_PACKAGE##` 替换值时, 会多执行一次额外替换, 替换内容是将 `\.entity|bean\.` 替换为 `.mapper.`, `.service.`, `.service_impl.` 或 `.controller.`. + +> 假如实体类定义于 `a.b.c.entity.d.e.TestEntity`, +> 生成 controller 时默认位置为 `a.b.c.controller.d.e` -修改 `@MVCIntrospective` 注解中的 `xxxPackage` 值即可调整相关结构的生成位置; 修改 `xxxName` 即可调整相关结构名称. +除去默认的替换键值, 还可以在 `@MVCIntrospective` 中的 `extraParams` 字段创建自定义替换键值. 如果多个配置中包含相同替换键, 将采用 **就近原则**, 更接近实体定义的替换键值将会被采用. + +> 假如在 `a.b` 包上指定了 `##TEST## = "test"`, +> 假如在 `a.b.c` 包上指定了 `##TEST## = "test2"`, +> 在 `a.b.c.TestBean` 上指定了 `##TEST## = "test3"`, +> 生成 `a.b.c.TestBean` 实体时将使用 `##TEST## = "test3"`, +> 生成 `a.b.c.Test2Bean` 实体时将使用 `##TEST## = "test2"`, +> 生成 `a.b.DemoBean` 实体时将使用 `##TEST## = "test"` ## 注意 @@ -61,6 +85,14 @@ MVCI 仅于 **Java17 环境** 下通过测试. ## 变动记录 +### 17.1.1 + +* 细微代码改动 + +### 17.1.0 + +* 调整配置方式, 现在可以以包为级别批量调整生成 + ### 17.0.0 * 提升JDK支持版本至17 diff --git a/src/main/java/firok/spring/mvci/MVCIntrospective.java b/src/main/java/firok/spring/mvci/MVCIntrospective.java index 61a0c37..a630e62 100644 --- a/src/main/java/firok/spring/mvci/MVCIntrospective.java +++ b/src/main/java/firok/spring/mvci/MVCIntrospective.java @@ -128,6 +128,7 @@ *

标明为此实体生成 mapper 时使用的名称模板.

*

indicate the name template to be used when generating mapper for this bean.

*

+ * resources/mapper.name.txt * ##BEAN_NAME_SHORT##Mapper : TestBeanTestMapper *

*/ @@ -138,6 +139,7 @@ *

标明为此实体生成 service 时使用的名称模板.

*

indicate the name template to be used when generating service for this bean.

*

+ * resources/service.name.txt * ##BEAN_NAME_SHORT##Service : TestBeanTestService *

*/ @@ -148,6 +150,7 @@ *

标明为此实体生成 service impl 时使用的名称模板.

*

indicate the name to be used when generating service impl for this bean.

*

+ * resources/service_impl.name.txt * ##BEAN_NAME_SHORT##ServiceImpl : TestBeanTestServiceImpl *

*/ @@ -158,6 +161,7 @@ *

标明为此实体生成 controller 时使用的名称模板.

*

indicate the name to be used when generating controller for this bean.

*

+ * resources/controller.name.txt * ##BEAN_NAME_SHORT##Controller : TestBeanTestController *

*/ @@ -169,16 +173,36 @@ /** *

标明为此实体生成 mapper 时的目标包位置.

*

indicate the target package when generating mapper for this bean.

+ * + * resources/mapper.package.txt */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateMapperPackage() default PREFER_DEFAULT; + /** + *

标明为此实体生成 mapper 时的目标包位置.

+ *

indicate the target package when generating mapper for this bean.

+ * + * resources/service.package.txt + */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateServicePackage() default PREFER_DEFAULT; + /** + *

标明为此实体生成 service 时的目标包位置.

+ *

indicate the target package when generating service for this bean.

+ * + * resources/service_impl.package.txt + */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateServiceImplPackage() default PREFER_DEFAULT; + /** + *

标明为此实体生成 controller 时的目标包位置.

+ *

indicate the target package when generating controller for this bean.

+ * + * resources/controller.package.txt + */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateControllerPackage() default PREFER_DEFAULT; @@ -187,6 +211,8 @@ /** *

标明为此实体生成 mapper 时使用的模板.

*

indicate the template to be used when generating mapper for this bean.

+ * + * resources/mapper.java.txt */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateMapperContent() default PREFER_DEFAULT; @@ -194,6 +220,8 @@ /** *

标明为此实体生成 service 时使用的模板.

*

indicate the template to be used when generating service for this bean.

+ * + * resources/service.java.txt */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateServiceContent() default PREFER_DEFAULT; @@ -201,6 +229,8 @@ /** *

标明为此实体生成 service impl 时使用的模板.

*

indicate the template to be used when generating service impl for this bean.

+ * + * resources/service_impl.java.txt */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateServiceImplContent() default PREFER_DEFAULT; @@ -208,6 +238,8 @@ /** *

标明为此实体生成 controller 时使用的模板.

*

indicate the template to be used when generating controller for this bean.

+ * + * resources/controller.java.txt */ @AvailableValues({ PREFER_DEFAULT, DEFAULT, CUSTOM }) String templateControllerContent() default PREFER_DEFAULT; diff --git a/src/main/java/firok/spring/mvci/internal/BeanContext.java b/src/main/java/firok/spring/mvci/internal/BeanContext.java index 61ebc62..fd0704e 100644 --- a/src/main/java/firok/spring/mvci/internal/BeanContext.java +++ b/src/main/java/firok/spring/mvci/internal/BeanContext.java @@ -151,17 +151,19 @@ private static String nonDefault(List configs, Function extras) { - mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams, extras)); + String value = RegexPipeline.pipelineAll(valueTemplate, mapExtraParams); + if(extras != null) value = RegexPipeline.pipelineAll(value, extras); + mapExtraParams.put(valueKey, value); } private void single(String valueKey, String valueTemplate) { - mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams, null)); + mapExtraParams.put(valueKey, RegexPipeline.pipelineAll(valueTemplate, mapExtraParams)); } private void write(String valueKeyLocation, String valueKeyName, String templateContent) throws Exception { String valueLocation = mapExtraParams.get(valueKeyLocation); String valueName = mapExtraParams.get(valueKeyName); - String valueContent = RegexPipeline.pipelineAll(templateContent, mapExtraParams, null); + String valueContent = RegexPipeline.pipelineAll(templateContent, mapExtraParams); try(var writer = mvci.createSourceFileWrite(valueLocation + "." + valueName)) { writer.write(valueContent); diff --git a/src/main/java/firok/spring/mvci/internal/RegexPipeline.java b/src/main/java/firok/spring/mvci/internal/RegexPipeline.java index 90b52a9..70e77f7 100644 --- a/src/main/java/firok/spring/mvci/internal/RegexPipeline.java +++ b/src/main/java/firok/spring/mvci/internal/RegexPipeline.java @@ -6,7 +6,7 @@ public class RegexPipeline { - public static String pipelineAll(String content, Map mapParams, Map extras) + public static String pipelineAll(String content, Map mapParams) { for(var entryParam : mapParams.entrySet()) { @@ -17,18 +17,6 @@ public static String pipelineAll(String content, Map mapParams, content = regexPattern.matcher(content).replaceAll(replacement); } - if(extras != null) - { - for(var entryParam : extras.entrySet()) - { - String regexString = entryParam.getKey(); - String replacement = entryParam.getValue(); - - Pattern regexPattern = getPattern(regexString); - - content = regexPattern.matcher(content).replaceAll(replacement); - } - } return content; } public static String pipelineFirst(String content, Map mapParams)