Java使用AOP操作日志,傻瓜版

1.我们先创建一个属于我们自己的注释类里面用来放日志的信息(操作类型,操作内容等)
注意的市类上面要加这些注释:
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component

2.创建一个日志的类里面属性可以自定义为自己要的信息

package com.cykj.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Timestamp;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Log {

  private long logId;
  private String managerId;
  private String time;
  private String type;
  private String content;
  private String url;
  private String ip;
  private String managerName;

}

3.在bean创建一个切面类

package com.cykj.bean;

import com.cykj.annotation.SysLogAnnotation;
import com.cykj.mapper.LogMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;


@Component
@Aspect
public class SystemLogAspect {
    @Autowired
    private LogMapper logMapper;
    //方法切入点
//    @Pointcut("execution(* com.cykj.service.Impl..*.*(..))")//这个是再每一个ServiceImpl都会切入日志方法也就是说每个ServiceImpl都要写一个注释,我没有用这个作为切入点这里只做介绍
    @Pointcut("@annotation(com.cykj.annotation.SysLogAnnotation)")//我的切入点设为这个自定义注释,也就是说哪里有注释我就在哪里注释,这样就不用到处都是注释,自己想哪里就哪里更灵活方便
    public void pointCut(){}
    @Before("pointCut()")//在方法执行之前切入工作
    public void sleep(){}
    @After("pointCut()")//在方法执行之后切入工作,一般用之后看个人需求
    public void addLog(JoinPoint joinPoint) throws UnknownHostException {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();//一大串用来获取登入的session以此获取操作人ID
        HttpSession session = request.getSession();
        Class<?> aClass = joinPoint.getTarget().getClass();//获取操作的地方:ServiceImpl
        String name  =joinPoint.getSignature().getName();//login
        Log log = new Log();//建立实例日志对象用来记录
        InetAddress address = InetAddress.getLocalHost();//获取IP地址
        log.setIp(address.getHostAddress());
        log.setManagerId(String.valueOf(session.getAttribute("id")));
        Method[] methods = aClass.getMethods();
        Object[] argumets = joinPoint.getArgs();
        for (Method method:methods) {
            String methodName = method.getName();
            Class[] clazzs = method.getParameterTypes();
            if (methodName.equals(name) && clazzs.length == argumets.length){//方法同名相同进入
                SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd ':' HH:mm:ss");//设置时间格式
                Date date = new Date(System.currentTimeMillis());//获取当前时间
                String timestamp = formatter.format(date);//格式转换
                SysLogAnnotation annotation = method.getAnnotation(SysLogAnnotation.class);
                String sysLogType = annotation.sysLogType();
                String logContent = annotation.sysLogContent();
                System.out.println("进入AOP");
                log.setTime(timestamp);
                log.setType(sysLogType);
                log.setContent(logContent);
            }
        }
        logMapper.addLog(log);//这个是Mapper层里面给数据库记入日志的方法这里就不多做说明,读者自己去创建
    }

}

4.注释的如何使用
在这里插入图片描述
5.最后只要写好mapper里面的方法日志就会被记录到数据库
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dont give up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值