思路:
aop :利用aop的横切面的思路,在每个service中的方法执行之后,执行一个日志存储的功能.
具体步骤:
1.先定义一个日志模型,定义需要存储哪些日志操作信息.
2.编写mapper接口,定义日志的CRUD或其他的功能
3.配置mapper映射文件的各种sql查询以及查询结果中的列与对象属性的对应,完成对象与数据库的映射.
4.编写service服务层代码,封装mapper(Dao)的功能.
5.编写LogUtil类,,定义WriteLog(JoinPoint jp)方法,JoinPoint jp为spring在这个方法调用时为我们传递,即连接点.
[注:
切面包括以下部分:
* 切入点 (在哪里做事情)
* 通知 (增强)
* 连接点 (切入时的上下文信息)
]
接下来,就在该方法内获取当前执行的方法的各种信息,并封装到我们的日志模型中,并持久化到数据库中.
具体代码:
package com.tab.crm.utils;import java.util.Date;import org.aspectj.lang.JoinPoint;import com.tab.crm.domain.SystemLog;import com.tab.crm.service.ISystemLogService;public class SystemLogUtils { // 注入日志的services private ISystemLogService service; public void setService(ISystemLogService service) { this.service = service; } // 日志写入方法 @SuppressWarnings("rawtypes") public void writeLog(JoinPoint jp) { // 获取当前方法所在的对象 Object targetObj = jp.getTarget(); // 如果进入了log的service中则退出该方法,解决死循环 if (targetObj instanceof ISystemLogService) { return; } // System.out.println(jp.getClass()); // System.out.println(jp.getKind()); // System.out.println(jp.getThis()); SystemLog log = new SystemLog(); //使用封装了自定义的ActionContext的UserContext获取当前session中的user对象 log.setOpUser(UserContext.getUser()); //使用封装了自定义的ActionContext的UserContext获取当前request中的ip地址 log.setOpIp(UserContext.getOpIp()); log.setOpTime(new Date()); // 获取当前的正在执行的service类 Class serviceClz = jp.getTarget().getClass(); // 获取当前的正在执行的方法名 String methodName = jp.getSignature().getName(); log.setFunction(serviceClz.getName() + "." + methodName); service.save(log); }}
原标题:在springmvc中使用系统日志,记录service服务层的详细功能调用
关键词:Spring