在开发过程中,有些表中会有创建时间create_time、更新时间update_time和逻辑删除valid等字段。
每次对数据进行新增、修改和删除都需要对这些字段进行设置。传统的做法是在进行这些操作前,对实体类的字段进行set赋值,然后再进行数据库操作。
这种做法的坏处不仅容易忘记导致出错、而且显得代码冗余。
Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Insert {
}
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
private String code;
private Long valid;
private Date createTime;
private Date updateTime;
private String name;
}
AOP 切面
@Component
@Aspect
public class InsertAspect {
@Pointcut("@annotation(com.maoslv.annotation.Insert)")
public void pointcut() {}
@Around("pointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if (null != arg) {
String packName = arg.getClass().getPackage().getName();
// 我的实体类放在pojo下,这里可以根据个人需求修改
if ("pojo".equals(packName.substring(packName.length() - 4)) && packName.length() >= 4) {
fieldSetValue(arg);
}
}
}
// 执行方法
Object result = joinPoint.proceed();
return result;
}
/**
* TODO: 填充字段
* @param object
*/
private void fieldSetValue(Object object) {
try {
Field code = object.getClass().getDeclaredField("code");
code.setAccessible(true);
code.set(object, UUIDUtils.getUUID());
Field valid = object.getClass().getDeclaredField("valid");
valid.setAccessible(true);
valid.set(object, 1L);
Field createTime = object.getClass().getDeclaredField("createTime");
createTime.setAccessible(true);
createTime.set(object, new Date());
Field updateTime = object.getClass().getDeclaredField("updateTime");
updateTime.setAccessible(true);
updateTime.set(object, new Date());
} catch (NoSuchFieldException e) {
System.err.println(e);
} catch (IllegalAccessException e) {
System.err.println(e);
}
}
}
测试
@RestController
public class AopController {
@RequestMapping("/test")
@Insert
public void test(User user) {
System.out.println(user);
}
}