借助Aop切面实现日志功能并保存数据库
使用Aop步骤如下:
1.增强方法
1. 日志信息获取
2. 日志信息添加至数据库
2.增强类型
后置增强
ps: 我这里使用的后置增强,当然你也可以使用前置增强或者环绕增强
3.切入点
切注解
ps:当然你也可以用来切方法
实现步骤:
- 定义日志实体类
- 定义dao方法
- 实现mapper.yml
- 定义service方法
- 实现service方法
- 实现controller接口
重头戏来了!
- 在自己的包里创建一个aop的包和annotation的包,在包里创建一个类如下↓
ps:
- aop包:用来写切面类
- annotation:用来写在方法上的返回信息
- 在自己切面类里写入切面注解,然后把mapper层方法注入进来以及要用到的方法如下↓
@Aspect 作用是把当前类标识为一个切面供容器读取
@Component 类交给Spring管理
需要写一个切入点 ,我这边切的就是刚刚写的那个annotation包下的那个类如下↓
ps: - 这里说一下annotation类里写的是一些返回给数据库的信息,也就是要定义在serviceImpl类上面的如下↓
- 接着就需要编写aop里的代码以及逻辑了 这里我写的注释还是比较清晰的 如下↓
public void CrudCommandAfter(JoinPoint joinPoint){//joinPoint获取目标方法的所有信息
//导入hutool工具类jar包 cn.hutool.core.lang.ObjectId;
String next = ObjectId.next();
/**
*1.获取日志信息
*/
CrudCommand crudCommand =new CrudCommand();
//日志
crudCommand.setCrudCommandIpcExpiredDate(new Date());
//ip 通过工具类
String byRequest = IPKit.getIpAddrByRequest(request);
System.err.println(byRequest);
//日志打印
crudCommand.setCrudCommandIpcEndpoint(byRequest);
//session用户名
CrudCommand admin = (CrudCommand)request.getSession().getAttribute("admin");
if(admin != null){
crudCommand.setCrudCommandIpcId(admin.getCrudCommandIpcId());
}else{
crudCommand.setCrudCommandIpcId(next);
}
/**
* 操作内容和接收格式'
* 获取目标方法上的注解 连接点对象
*/
//1.获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//2.通过方法签名获取方法对象
Method method = signature.getMethod();
//3.通过方法对象 获取方法对象注解
LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
//获取值
String type = annotation.type();
crudCommand.setCrudCommandIpcAction(type);
crudCommand.setCrudCommandIpcResponse(annotation.response());
crudCommand.setCrudCommandIpcState(annotation.state());
/**
* 2.日志信息保存到数据库
* 调用mapper添加方法
*/
/* System.err.println("==================crudCommand"+crudCommand);*/
commandMapper.append(crudCommand);
/*System.err.println("测试后置增强。");*/
}
5.接下来就需要往service加切面的注解了 以为我在annotation类里写了一些默认值 所以在service使用注解使也是可以不给某些参数赋值的 当然这个注解也是可以添加在Controller层的 但是不建议 如下↓
6.最终结果如下↓
ps:我是用SpringBoot框架来做的。