欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AOP的日志管理

程序员文章站 2022-03-02 15:39:49
...
  1. 编写一个通知类:必须让springmvc能扫描到
    • 添加一个注解@Component交给springmvc容器管理
    • 添加一个注解@Aspect 声明它是通知类
    • 编写一个增强的方法
      • 添加环绕通知注解@Around("exection(* cn.itcast.web.controller..*.*(..))")
      • 执行原来的逻辑
      • 组装日志对象
      • 调用SysLogService中save方法,保存日志
  2. 在springmvc.xml中开启aop的自动代理
@Component
@Aspect
public class SysLogAspect {

    @Autowired
    HttpSession session;

    @Autowired
    HttpServletRequest request;

    @Autowired
    SysLogService sysLogService;

    @Around("execution(* cn.itcast.web.controller..*.*(..))")
    public Object saveSysLog(ProceedingJoinPoint pjp) throws Throwable {

        //让目标方法执行
        Object result = pjp.proceed();

        //组装日志对象
        SysLog sysLog = new SysLog();
        //获取当前登陆的用户
        User loginUser = (User) session.getAttribute("loginUser");
        if (loginUser!=null) {
            sysLog.setUserName(loginUser.getUserName());
            sysLog.setIp(request.getLocalAddr());
            sysLog.setTime(new Date());

            //获取请求的方法
            MethodSignature signature = (MethodSignature) pjp.getSignature();//获取方法签名
            Method method = signature.getMethod();

            sysLog.setMethod(method.getName());
            //设置方法的描述,就是@RequestMapping注解的name属性值
            RequestMapping anno = method.getAnnotation(RequestMapping.class);
            sysLog.setAction(anno.name());

            sysLog.setCompanyId(loginUser.getCompanyId());
            sysLog.setCompanyName(loginUser.getCompanyName());

            //保存日志
            sysLogService.save(sysLog);
        }
        return result;
    }
}```