SpringBoot 公共字段自动填充
时间: 2024-12-26 08:18:46 浏览: 1
### Spring Boot 中实现公共字段自动填充
在Spring Boot项目中,为了简化代码并减少重复操作,可以采用面向切面编程(AOP)来实现在插入和更新数据库记录时对某些公共字段的自动填充。这确保了诸如`create_time`、`update_time`、`creator_id`等字段能够自动且一致地获得初始值或最新时间戳。
#### 添加 AOP 依赖
要启用AOP功能,在项目的`pom.xml`文件里加入如下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
此依赖项允许定义切面逻辑用于拦截特定的方法调用[^1]。
#### 定义枚举类 `OperateType`
对于不同的业务场景可能需要区分是新增还是修改操作,因此可以通过自定义枚举类型来表示这些情况:
```java
public enum OperateType {
INSERT, UPDATE;
}
```
该枚举将帮助识别当前正在进行的操作以便于适当地设置相应的时间戳或其他属性。
#### 创建注解 @AutoFill
为了让开发者能够在Mapper接口的方法上标记哪些应该触发自动填充行为,建议创建一个新的自定义注解:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
OperateType value();
}
```
这个简单的注解接收一个参数指定是要处理插入还是更新事件。
#### 编写 Aspect 切片
最后一步就是编写实际执行自动填充工作的Aspect组件。这里假设有一个名为`BaseEntity`的基础实体基类包含了所有待填充值的字段,则可以在切面前置通知内完成具体工作:
```java
@Component
@Aspect
@Slf4j
public class AutoFillAspect {
@Pointcut("@annotation(com.example.demo.annotation.AutoFill)")
public void autoFill() {}
@Before("autoFill()")
public void doAutoFill(JoinPoint joinPoint){
Object[] args = joinPoint.getArgs();
Arrays.stream(args).forEach(arg -> {
if (arg instanceof BaseEntity) {
BaseEntity baseEntity = (BaseEntity)arg;
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
AutoFill annotation = method.getDeclaredAnnotation(AutoFill.class);
OperateType operateType = annotation.value();
switch (operateType) {
case INSERT:
baseEntity.setCreateTime(new Date());
baseEntity.setUpdateTime(baseEntity.getCreateTime());
break;
case UPDATE:
baseEntity.setUpdateTime(new Date());
break;
}
}
});
log.info("Automatically filled common fields.");
}
}
```
上述代码片段展示了如何利用反射机制访问目标对象及其方法上的元数据,并据此调整实例变量的内容以反映最新的时间和状态变化。
阅读全文