aop日志
oracle数据库准备工作
CREATE TABLE sys_log(
id varchar2(32) default sys_guid() PRIMARY KEY,
visitTime date,
username VARCHAR2(50),
ip VARCHAR2(30),
url VARCHAR2(50),
executionTime number,
method VARCHAR2(200)
)
日志pojo对象`
package com.itheima.domian;
import java.util.Date;
/**
* 日志pojo对象
*/
public class SysLog {
private String id;//主键
private Date visitTime;//访问时间
private String username;//访问者名称
private String ip;// 访问电脑的ip地址
private String url;//访问的路径
private Long executionTime;//在方法中停留的时间
private String method;//类名和方法名
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getVisitTime() {
return visitTime;
}
public void setVisitTime(Date visitTime) {
this.visitTime = visitTime;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Long getExecutionTime() {
return executionTime;
}
public void setExecutionTime(Long executionTime) {
this.executionTime = executionTime;
}
public String getMethod() {
return method;
}
public void setMethod(String method) {
this.method = method;
}
}
service
SysLogService
package com.itheima.service;
import com.itheima.domian.SysLog;
public interface SysLogService {
public void save(SysLog sysLog);
}
SysLogServiceImpl
package com.itheima.service.impl;
import com.itheima.dao.SysLogDao;
import com.itheima.domian.SysLog;
import com.itheima.service.SysLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class SysLogServiceImpl implements SysLogService {
@Autowired
private SysLogDao sysLogDao;
@Override
public void save(SysLog sysLog) {
System.out.println("SysLogServiceImpl");
sysLogDao.save(sysLog);
}
}
`dao
package com.itheima.dao;
import com.itheima.domian.SysLog;
import org.apache.ibatis.annotations.Insert;
public interface SysLogDao {
@Insert("insert into sys_log (visitTime, username, ip, url, executionTime, method) " +
"values (#{visitTime}, #{username}, #{ip}, #{url}, #{executionTime}, #{method})")
public void save(SysLog sysLog);
}
增强类
package com.itheima.controller.advice;
import com.itheima.domian.SysLog;
import com.itheima.service.SysLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* 日志增强类
*/
@Component
@Aspect
public class LogAdvice {
@Autowired
private SysLogService sysLogService;
//需要用到request域对象
//在web.xml中配置request监听器 放入ioc容器中
@Autowired
private HttpServletRequest request;
//切入点表达式
@Around("execution(* com.itheima.controller.*.*(..))")
public Object around(ProceedingJoinPoint pjp){
Object obj = null;
try {
System.out.println("前");
Date now = new Date();
//得到当前正在访问的处理器类 和处理器类名
Class clazz = pjp.getTarget().getClass();
String name = clazz.getName();
//获得当前执行的方法名
String methodName = pjp.getSignature().getName();
//获得当前方法参数
Object[] args = pjp.getArgs();
//放行当前方法
obj = pjp.proceed(args);
System.out.println("后");
//创建日志对象
SysLog log = new SysLog();
log.setVisitTime(now);
log.setUsername(request.getRemoteUser()); //获得当前用户名
log.setIp(request.getRemoteAddr()); //获得当前ip
log.setUrl(request.getRequestURI()); //获得当前访问的路径
log.setExecutionTime(new Date().getTime() - now.getTime()); //访问时长
log.setMethod("类名"+name + "方法名"+methodName);
//调用service
sysLogService.save(log);
}catch (Throwable t){
t.printStackTrace();
}
return obj;
}
}
增强类需要的配置
获得request 的配置
先在web.xml中添加一个request上下文的监听器
<!--监听requset的创建 创建后把当前request 放入ioc容器中-->
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
springmvc 中开启注解支持
<!--aop注解支持-->
<aop:aspectj-autoproxy/>