拦截器
AutoTable执行过程中提供了多个钩子,方便拦截甚至修改过程中的信息。拦截器的拦截实际参考流程图
拦截修改表信息
以群里小伙伴的需求举例,对表及字段的注释进行国际化,可以通过实现BuildTableMetadataInterceptor
接口来完成。
java
/**
* 表信息拦截器
* 注解构建完表元信息后,执行拦截器
*/
@FunctionalInterface
public interface BuildTableMetadataInterceptor {
/**
* 拦截器
*
* @param databaseDialect 数据库方言:MySQL、PostgreSQL、SQLite
* @param tableMetadata 表元数据:MysqlTableMetadata、DefaultTableMetadata、DefaultTableMetadata
*/
void intercept(final String databaseDialect, final TableMetadata tableMetadata);
}
提示
接口只有一个方法,可以直接修改第二个参数内的信息实现自定义表信息,注意,需要根据第一个参数判断数据库类型,根据不同的数据库,TableMetadata
对应不同的子类。
以MySQL举例:
java
// spring boot应用,可以直接使用@Component注入
@Component
public class MyBuildTableMetadataInterceptor implements BuildTableMetadataInterceptor {
/**
* 拦截器
* @param databaseDialect 数据库方言:MySQL、PostgreSQL、SQLite
* @param tableMetadata 表元数据:MysqlTableMetadata、DefaultTableMetadata
*/
public void intercept(final String databaseDialect, final TableMetadata tableMetadata) {
// DatabaseDialect.MYSQL是框架内置常量,可以直接使用
if (DatabaseDialect.MYSQL.equals(databaseDialect)) {
MysqlTableMetadata mysqlTableMetadata = (MysqlTableMetadata) tableMetadata;
// 此处会修改表注释,在原注释后,添加一段文本
mysqlTableMetadata.setComment(mysqlTableMetadata.getComment() + "-我是表注释的小尾巴~");
}
}
}
提示
SpringBoot应用,直接通过@Component等注解,将实现类注入spring容器即可,普通java应用需要手动调用AutoTableGlobalConfig.setBuildTableMetadataInterceptor
设置
java
// 普通java应用(非spring boot),手动设置拦截器
AutoTableGlobalConfig.setBuildTableMetadataInterceptor(new MyBuildTableMetadataInterceptor());
表注解拦截器
该拦截器发生在AutoTable扫描需要自动维护表结构的实体之前,用户可以在该拦截器中修改需要被扫描的注解都有哪些,进而改变自动建表的实体集合
java
/**
* 自动表注解扫描拦截器
* <p>注解收集完后,会根据两个注解集合扫描指定的包下的类,本拦截器发生在扫描包之前。
* <p>因此,这里可以最终决定扫描哪些注解,排除哪些注解
*/
@FunctionalInterface
public interface AutoTableAnnotationInterceptor {
/**
* 拦截器,包含和排斥取交集,即:如果既包含又排斥,则会排除
*
* @param includeAnnotations 包含的注解
* @param excludeAnnotations 排除的注解
*/
void intercept(Set<Class<? extends Annotation>> includeAnnotations, Set<Class<? extends Annotation>> excludeAnnotations);
}
建表前拦截器
该拦截器触发时机相较于BuildTableMetadataInterceptor
,比较靠后,是在确定了要执行建表前进行拦截的,因此可以修改部分信息,影响建表的逻辑
java
/**
* 建表之前拦截器
*/
@FunctionalInterface
public interface CreateTableInterceptor {
/**
* 建表前拦截
*
* @param databaseDialect 数据库方言
* @param tableMetadata 表元数据
*/
void beforeCreateTable(String databaseDialect, final TableMetadata tableMetadata);
}
提示
用法参考BuildTableMetadataInterceptor
修改表前拦截器
该拦截器触发时机相较于BuildTableMetadataInterceptor
,比较靠后,是在确定了要执行改表前进行拦截的,因此可以修改部分信息,影响改表的逻辑
java
/**
* 修改表前拦截器
*/
@FunctionalInterface
public interface ModifyTableInterceptor {
/**
* 修改表前拦截
*
* @param databaseDialect 数据库方言
* @param tableMetadata 表元数据
* @param compareTableInfo 对比表信息
*/
void beforeModifyTable(String databaseDialect, final TableMetadata tableMetadata, final CompareTableInfo compareTableInfo);
}
提示
用法参考BuildTableMetadataInterceptor