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里面的方法日志就会被记录到数据库