在项目开发中,我们的数据库设计往往会包括创建人、创建时间、修改人、修改时间等公共字段,这些公共字段有助于帮助我们知道是谁对数据库记录进行了更改,但这带来的一个问题就是在进行数据库插入或修改的时候,这些字段需要手动设置,这会给我们带来很大不便,这里我简单讲一下采用aop方式进行公共字段填充,因为项目集成了tk.mybatis,很多单表的操作并没有显示指定接口,所以采用在service层方法进行切入来设置。以下列出用到的类,做一个思路的梳理,具体应用可自行更改。
其中SetCommonField是一个注解,该注解打在方法上即可启用aop,该注解包含一个methodType属性,这个属性定义数据库的四种操作(增删改查),在CommonFieldAspect类中定义了对应的常量。
功能实现思路是解析前端请求得出用户id(这里我的代码有点问题,各位可自行考虑怎么获取用户id),然后根据用户id查询redis缓存得到用户信息保存到UserInfo,然后再根据不同的methodType将userInfo转换为CommonField,最后我们读取切点方法的第一个参数,并将其与CommonField类同名的字段进行设置。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* aop设置公共字段增强处理注解
*
* @author TenSunLee
* @createdTime 2019/8/15 11点18分
* @version 1.0.0
* @updateBy TenSunLee
* @updatedTime 2019/8/15 11点18分
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SetCommonField {
/**
* 标注方法类型
* @return 方法类型字符串
*/
String methodType();
}
import java.sql.Timestamp;
import java.util.List;
/**
* 封装所有需要设置的公共字段类
*
* @author TenSunLee
* @createdTime 2019/8/15 13点38分
* @version 1.0.0
* @updateBy TenSunLee
* @updatedTime 2019/8/15 13点41分
*
*/
public class CommonField {
/**
* 组织机构id
*/
private Long orgId;
/**
* 公司id
*/
private Long companyId;
private Boolean manager;
private Byte managerLevel;
private List<RoleSimpleInfo> roles;
/**
* 创建人id
*/
private Long createdBy;
/**
* 创建时间
*/
private Timestamp createdTime;
/**
* 最后修改人id
*/
private Long updatedBy;
/**
* 最后修改时间
*/
private Timestamp updatedTime;
@Override
public String toString() {
return "CommonField{" +
"orgId=" + orgId +
", companyId=" + companyId +
", manager=" + manager +
", managerLevel=" + managerLevel +
", roles=" + roles +
", createdBy=" + createdBy +
", createdTime=" + createdTime +
", updatedBy=" + updatedBy +
", updatedTime=" + updatedTime +
'}';
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId