一.大致流程
1.使用自定义注解AutoFill,标识需要进行公共字段填充的方法
2.使用自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,最后通过反射统一为公共字段赋值
3.在Mapper的方法上加上AutoFill注解,让切面类拦截
二.具体实现
1.根据自己习惯创建注解包,且创建一个注解类
@Retention(RetentionPolicy.RUNTIME)
//该注解用于指定注解的保留策略为 RUNTIME,即该注解在运行时仍然有效,可以被JVM反射机制读取。
//这意味着即使程序运行起来,仍然可以通过反射获取到该注解的信息,从而在运行时进行一些自定义的处理。
//常用于在运行时需要对注解进行处理的场景,比如ORM框架中的注解处理、日志记录、权限控制等。
@Target(ElementType.METHOD)
//指定当前注解,作用的位置,如当前的注解是加载到方法上的,所以是ElementType.METHOD
public @interface AutoFill {
//使用枚举,标注出数据库的操作类型:这里是INSERT、UPDATE
OperationType value();
}
自定义注解类需要用到两个注解:
@Retention(RetentionPolicy.RUNTIME):用于指定指定该注解的保留策略,此处为运行时任然有效
@Target(ElementType.METHOD):用于指定当前注解的作用位置(作用域),这里是用于方法上的。
这里的OperationType value();定义的是在使用注解时,接受的参数类型如:
这里填入的值可以在后期使用反射机制获取,再进行自己的判断
2.创建一个切面类
重要的注解有:
@Aspect:表示这是一个切面类
@Component:切面类需要交给spring bean工厂管理
切面类由两部分组成:切入点+通知
切入点:需要实现AOP增强的位置
通知:自己实现的增强代码
a.在切面类中定义一个切入点(方法),方法名按照自己的业务需求自定义:
这个切入点需要用@Pointcut注解来标明它是一个切入点。
参数需要填入切点表达式,用来指定切面类的使用范围。
这里的范围是:mapper包下的所有文件,且方法上有AutoFill注解
b.在切面类中加入一个通知,用与写自己的AOP增强代码
定义通知方法时要使用注解来标明这个通知是在切点前执行还是在切点后执行。这里是在切点前执行,在调用持久层方法前,把重复字段在AOP中统一填充。
这里的operationType获得的是在使用@AutoFill注解时,里面传递的数据,就是这里的INSERT
获取到这个就可以进行业务判断,插入要填充四个字段,更新要填充两个字段
这里的args获取的是,使用@AutoFill注解的方法中的参数列表
entity获取的是实体对象,默认第一个是实体对象,所以是args[0]
这段代码目的是通过反射机制获取并调用实体对象中的 setter 方法
也可以写成这种形式,不过为了避免出现魔法值,所以都使用常量替换了
获取了公共字段的set方法,那么就可以把准备好的值统一填充