Skip to content

拦截器

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