SpringBoot公共字段自动填充(反射+AOP+自定义注解)
以下是一个简化的示例,展示了如何在Spring Boot中使用反射、AOP和自定义注解来实现公共字段的自动填充:
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Date;
// 自定义注解,用于标记需要自动填充的字段
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {
String value() default "";
}
// 实体类
public class Entity {
@AutoFill("createTime")
private Date createTime;
@AutoFill("updateTime")
private Date updateTime;
// 省略其他字段和getter/setter方法...
}
// AOP切面类
@Aspect
@Component
public class AutoFillAspect {
@Autowired
private UserInfo userInfo; // 用于获取创建人和更新人信息的类
@Before("@annotation(com.example.demo.AutoFill)")
public void autoFill(JoinPoint joinPoint) {
Object target = joinPoint.getTarget();
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields) {
AutoFill autoFill = field.getAnnotation(AutoFill.class);
if (autoFill != null) {
String fieldName = autoFill.value();
if ("createTime".equals(fieldName)) {
field.setAccessible(true); // 设置私有字段可访问
try {
field.set(target, new Date()); // 设置创建时间为当前时间
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else if ("updateTime".equals(fieldName)) {
field.setAccessible(true);
try {
field.set(target, new Date()); // 设置更新时间为当前时间
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
// 如果需要设置创建人或更新人,可以使用userInfo获取信息然后设置到对应字段
// 例如: field.set(target, userInfo.getCurrentUser());
}
}
}
}
// 假设的UserInfo类,用于获取当前用户信息
public class UserInfo {
public String getCurrentUser() {
// 实现获取当前用户的逻辑
return "currentUser";
}
}
// 使用示例
publi
评论已关闭