1. 编写springmvc.xml, 开启Aop自动代理
注意:在头部需要引入aop的标签
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy/>
</beans>
2. 编写日志切面类(@Aspect)
对所有controller的方法进行拦截,在方法执行完之后,记录日志
package com.lzq.controller.util;
import com.lzq.domain.system.syslog.SysLog;
import com.lzq.domain.system.user.User;
import com.lzq.service.system.syslog.SysLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.UUID;
@Aspect //配置了aop逻辑
@Component //非Controller,Service Repository
public class LogAspect {
@Autowired
SysLogService sysLogService;
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request;
private Logger l = LoggerFactory.getLogger(LogAspect.class);
public LogAspect() {
l.info("LogAspect 无参构造方法执行");
}
//要对所有的Controller的方法进行配置
//指定包名 controller 下以及它的所有子包
//
@Around(value = "execution(* com.lzq.controller..*.*Controller.*(..))")
public Object writeLog(ProceedingJoinPoint jp) {//切点
// jp表示Controller中的任意方法 toList toAdd toUpdate add update delete
//逻辑
Object result = null;//返回一个表示页面的字符串,也可通是json数据
try {
//前置
result = jp.proceed();//执行
//后置
//保存日志
l.info("切面:writeLog");
saveLog(jp);
} catch (Throwable e) {
//异常
} finally {
//最终
}
return result;
}
private void saveLog(ProceedingJoinPoint jp) {
SysLog log = new SysLog();
User user = (User)session.getAttribute("user");
if(user!=null){
log.setUserName(user.getUserName());
log.setCompanyId(user.getCompanyId());
log.setCompanyName(user.getCompanyName());
}
log.setTime(new Date());
log.setId(UUID.randomUUID().toString());
log.setAction(jp.getTarget().getClass().getName());
log.setMethod(jp.getSignature().getName());
log.setIp(request.getRemoteAddr());
sysLogService.addNewLog(log);
}
}
3.保存日志业务方法
service
@Override
public void addNewLog(SysLog log) {
sysLogDao.addLog(log);
}
dao
void addLog(SysLog log);
dao.xml
<insert id="addLog" parameterType="sysLog">
insert into st_sys_log
(
id ,
user_name ,
ip ,
time ,
method ,
ACTION ,
company_id ,
company_name
)
values
(
#{id },
#{userName },
#{ip },
#{time },
#{method },
#{action },
#{companyId },
#{companyName }
)
</insert>
4. 测试Aop,自动记录日志。