Aop存储操作记录到数据库是一个项目中管理员权限必备的要求,以便管理员查看用户操作,今天就让小编带大家完成这个功能
一、通过注解来标记对应Service
这里小编创建了一个注解类,里面定义了两个属性
1、用的时候只能用在Service层上面
2、message是记录时传递的数据
3、type是传递内容的类型
这里可以根据自己的需求随意更改!!
二、定义Diary的props
三、定义记录数据的Mapper和xml
三、Aop切面内容编写
@Slf4j
@Component
public class AopController {
@Autowired
private DiaryMapper diaryMapper;
@Pointcut("@annotation(com.example.spring.mapper.DiaryNote)")
public void DiaryMapper() {
}
/**
* 返回通知切面方法
*
* @param joinPoint 切点,就是被注解的目标方法
* @param result 切点方法返回体
*/
@AfterReturning(pointcut = "DiaryMapper()", returning = "result")
public void logPostMapping(JoinPoint joinPoint, Object result) {
log.info("=====================================================logStart========================================================");
// 声明一个返回类型
Diary diary = new Diary("", "", LocalDateTime.now(), "", 0, "", 0);
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
// 一个注解内部信息的对象
DiaryNote redis = (DiaryNote) method.getAnnotation(DiaryNote.class);
// 这里的redis就是注解类的内部属性
// Service接受的对象
Object[] objects = joinPoint.getArgs();
// 具体保存
SaveDiary(redis.type(), diary, objects[0], result);
log.info("========================================================logEnd========================================================");
}
public void SaveDiary(String type, Diary diary, Object objects, Object returnObject) {
// 这里是通过注解类里买呢type属性来执行对应的Dialog操作,
// 如果大家的数据记录没那么多要求,可以自己大改成很简单的逻辑
if (type.equals("登陆")) {
// 将传输过来的数据强转为对应Service对象类型
User user = (User) objects;
// 这里的returnMessage是对应的Service所return的参数
User returnMessage = (User) returnObject;
// 这里给diary设置各种属性存到数据库
diary.setDiaryType(type);
diary.setUsername(user.getUsername());
diary.setUserType(returnMessage.getUserType());
diary.setMessage(redis.message());
}
} else if (type.equals("其他type....")){
........
}
// 最后使用Mapper里的方法来存储到数据库
diaryMapper.saveOperateDiary(diary);