解放双手:SpringBlade代码生成器插件开发指南
解放双手:SpringBlade代码生成器插件开发指南
还在重复编写CRUD代码?SpringBlade的代码生成器能帮你自动生成80%的基础代码,但标准模板总有无法满足定制化需求的时候。本文将带你从零开发自定义插件,实现业务逻辑的自动注入,让代码生成效率提升300%。读完本文你将掌握:插件开发全流程、模板扩展技巧、实战案例调试方法。
核心原理:代码生成器工作流程
SpringBlade代码生成器基于MyBatis-Plus扩展开发,通过数据源配置、模板渲染、代码输出三个阶段完成自动化构建。核心实现类BladeCodeGenerator位于blade-ops/blade-develop/src/main/java/org/springblade/develop/support/BladeCodeGenerator.java,主要处理流程如下:
在CodeController的genCode方法中(blade-ops/blade-develop/src/main/java/org/springblade/develop/controller/CodeController.java第132行),通过设置生成器参数启动生成流程:
BladeCodeGenerator generator = new BladeCodeGenerator();
generator.setDriverName(datasource.getDriverClass());
generator.setUrl(datasource.getUrl());
generator.setUsername(datasource.getUsername());
generator.setPassword(datasource.getPassword());
// 20+项可配置参数...
generator.run();
开发准备:环境与目录结构
必要依赖
确保pom.xml中包含代码生成器核心依赖:
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-develop</artifactId>
<version>2.7.0</version>
</dependency>
插件开发目录
推荐在blade-develop模块下创建插件开发专用目录:
blade-ops/blade-develop/
├── src/main/java/org/springblade/develop/
│ ├── plugin/ // 插件接口定义
│ ├── extension/ // 插件实现类
│ └── template/ // 自定义模板文件
└── src/test/java/org/springblade/develop/plugin/ // 插件测试类
插件开发实战:业务审计日志自动注入
1. 定义插件接口
在plugin目录下创建ICodeGeneratorPlugin接口:
public interface ICodeGeneratorPlugin {
/**
* 插件执行顺序,值越小越先执行
*/
int getOrder();
/**
* 代码生成前处理
*/
void beforeGenerate(BladeCodeGenerator generator, TableInfo tableInfo);
/**
* 代码生成后处理
*/
void afterGenerate(BladeCodeGenerator generator, List<File> generatedFiles);
}
2. 实现审计日志插件
创建AuditLogPlugin实现类,自动为Service层添加审计日志注解:
@Component
public class AuditLogPlugin implements ICodeGeneratorPlugin {
@Override
public int getOrder() {
return 100; // 确保在模板渲染后执行
}
@Override
public void afterGenerate(BladeCodeGenerator generator, List<File> generatedFiles) {
for (File file : generatedFiles) {
if (file.getName().endsWith("ServiceImpl.java")) {
injectAuditLogAnnotation(file);
}
}
}
private void injectAuditLogAnnotation(File serviceFile) {
// 使用Apache Commons IO读取文件内容
String content = FileUtils.readFileToString(serviceFile, StandardCharsets.UTF_8);
// 正则匹配类定义行,插入@AuditLog注解
String modified = content.replace("public class ", "@AuditLog(module = \"" + getModuleName(serviceFile) + "\")\npublic class ");
FileUtils.writeStringToFile(serviceFile, modified, StandardCharsets.UTF_8);
}
}
3. 配置插件加载
修改BladeCodeGenerator的run方法,添加插件扫描逻辑:
public void run() {
// 原有初始化逻辑...
// 扫描并加载所有插件
List<ICodeGeneratorPlugin> plugins = SpringUtil.getBeansOfType(ICodeGeneratorPlugin.class).values()
.stream().sorted(Comparator.comparingInt(ICodeGeneratorPlugin::getOrder))
.collect(Collectors.toList());
// 执行前置插件
plugins.forEach(plugin -> plugin.beforeGenerate(this, tableInfo));
// 模板渲染核心逻辑...
// 执行后置插件
plugins.forEach(plugin -> plugin.afterGenerate(this, generatedFiles));
}
模板扩展:自定义Velocity模板
模板文件位置
系统默认模板位于classpath:templates目录,自定义模板建议放在项目src/main/resources/templates/custom下,通过以下代码指定模板路径:
generator.setTemplatePath("classpath:templates/custom");
实体类模板扩展示例
修改entity.java.vm模板,添加Swagger注解支持:
## 原有模板内容...
#if($superEntityClass)
public class $entityName extends $superEntityClass<#if($pkType)#$pkType#else#String#end> {
#else
public class $entityName implements Serializable {
#end
## 新增Swagger注解
@ApiModel(value = "$entityName对象", description = "$tableComment")
public class $entityName {
#foreach ($field in $fields)
@ApiModelProperty(value = "$field.comment")
private $field.propertyType $field.propertyName;
#end
}
调试与测试
单元测试
使用CodeGenerator.java测试类进行插件调试,配置测试参数:
public static void main(String[] args) {
BladeCodeGenerator generator = new BladeCodeGenerator();
generator.setServiceName("blade-demo");
generator.setPackageName("org.springblade.demo");
generator.setIncludeTables("demo_order");
generator.setPluginClasses(AuditLogPlugin.class); // 加载自定义插件
generator.run();
}
常见问题排查
- 模板渲染异常:检查
Velocity语法,特别注意$符号转义 - 插件不执行:确认
@Component注解是否添加,包扫描路径是否正确 - 代码重复生成:在
afterGenerate方法中添加文件存在性检查
生产环境部署
插件打包
将开发好的插件打包为jar,放入项目lib目录,在application.yml中配置:
blade:
code:
plugin:
enabled: true
packages: org.springblade.develop.extension
性能优化
对生成大量文件的场景,建议开启并行生成:
generator.setParallel(true);
generator.setThreadCount(5); // 5线程并行生成
高级技巧:动态数据源适配
通过实现IDataSourcePlugin接口,支持多类型数据库适配:
public interface IDataSourcePlugin {
String getDbType();
String getDriverClass();
String getQuerySql();
}
// MySQL实现
public class MysqlDataSourcePlugin implements IDataSourcePlugin {
@Override
public String getDbType() {
return "mysql";
}
@Override
public String getQuerySql() {
return "SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?";
}
}
总结与展望
自定义插件开发让SpringBlade代码生成器从"基础工具"升级为"业务生产力引擎"。通过本文介绍的插件架构,开发者可以实现:
- 权限代码自动注入
- 多租户逻辑适配
- 缓存注解生成
- 前端API文档同步
下一期我们将探讨如何基于抽象语法树(AST)实现更复杂的代码重构功能,敬请关注。
收藏本文,转发给团队同事,一起摆脱重复劳动!需要获取完整示例代码,请访问项目doc/开发指南目录。
更多推荐

所有评论(0)