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
: TestBean
→ TestMapper
*
*/
@@ -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
: TestBean
→ TestService
*
*/
@@ -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
: TestBean
→ TestServiceImpl
*
*/
@@ -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
: TestBean
→ TestController
*
*/
@@ -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)