1.什么是AOP?
面向切面编程
在不改变原有代码的基础上生成动态代理类
2.适用场景
(1)日志打印
(2)事务管理
(3)权限
(4)安全
3.AOP日志管理实现
(1)配置xml,开启AOP自动代理
springmvc.xml
<aop:aspectj-autoproxy/>
(2)编写日志切面类
//编写切面类
@Aspect//配置了aop逻辑
@Component//非Controller,Service Repository;
public class LogAspect {
public static final Logger l= LoggerFactory.getLogger(LogAspect.class);
public LogAspect(){
//构造无参方法
l.info("lOGAspect构造无参方法");
}
//对所有Controller方法下进行配置
//指定包名Controller以及下的子包
@Around(value = "execution(* com.xjj.web.Controller..*.*Controller.*(..))")
public Object writeLog(ProceedingJoinPoint jp){//切点
//jp表示Controller中任意的方法 toList toAdd toupdate add等
//逻辑
Object result=null;//返回一个表示页面的字符串,可能也是json数据
try {
//前置
result=jp.proceed();
//后置
//报错日志
l.info("切面writeLog"+result);
saveSysLog(jp);
} catch (Throwable e) {
//异常
}finally {
//最终
}
return result;
}
//request可以直接获取对方浏览器ip
@Autowired
HttpServletRequest request;
@Autowired
HttpSession session;
@Autowired
ISysLogService iSysLogService;
private void saveSysLog(ProceedingJoinPoint jp){
SysLog sysLog=new SysLog();
//将一个表单保存在javaBean中,再将javaBean储存到数据库
User user=(User) session.getAttribute("loginUser");
if(user!=null){
//设置用户登录信息
sysLog.setUserName(user.getUserName());
sysLog.setCompanyId(user.getCompanyId());
sysLog.setCompanyName(user.getCompanyName());
}//IP地址 request.getRemoteAddr()获取并请求ip地址
sysLog.setIp(request.getRemoteAddr());
//设置时间
sysLog.setTime(new Date());
//执行的方法
sysLog.setMethod(jp.getSignature().getName());
//类的执行名称 目标对象
sysLog.setAction(jp.getTarget().getClass().getName());
l.info("saveSyLog Log:"+sysLog);
iSysLogService.saveLog(sysLog);
}
}