你的位置:首页 > Java教程

[Java教程]在springmvc中使用系统日志,记录service服务层的详细功能调用


思路:

  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);  }}