本文源码:
GitHub·点这里| |
GitEE·点这里
1,什么是AOP编程
在软件业,AOP为面向方面编程的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是春天框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
3,AOP中术语和图解
<前>
<代码> 1)目标:目标类
需要被代理的类,例如:UserService
2)连接点:连接点
所谓连接点是指那些可能被拦截到的方法,例如:所有的方法
3)切入点:切入点
已经被增强的连接点。例如:addUser ()
4)建议:通知/增强
增强代码,例如:之后,之前
5)编织:织入
指把增强建议应用到目标对象目标来创建新的代理对象代理的过程。
6)代理代理类
(7)方面切面):是切入点切入点和通知建议的结合
一个线是一个特殊的面。
一个切入点和一个通知,组成成一个特殊的面。
代码>
二、与SpringBoot2.0整合
2、编写日志记录注解
<前>
<代码类=" lang-java ">包com.boot.aop.config;
进口java.lang.annotation。*;
@Target (ElementType.METHOD)
@Retention (RetentionPolicy.RUNTIME)
@Documented
公共@ interface LogFilter {
字符串值()默认””;
}
代码>
包com.boot.aop.config;
进口com.alibaba.fastjson.JSONObject;
进口org.aspectj.lang.ProceedingJoinPoint;
进口org.aspectj.lang.annotation.Around;
进口org.aspectj.lang.annotation.Aspect;
进口org.aspectj.lang.annotation.Pointcut;
进口org.aspectj.lang.reflect.MethodSignature;
进口org.slf4j.Logger;
进口org.slf4j.LoggerFactory;
进口org.springframework.stereotype.Component;
进口org.springframework.web.context.request.RequestContextHolder;
进口org.springframework.web.context.request.ServletRequestAttributes;
进口javax.servlet.http.HttpServletRequest;
进口java.lang.reflect.Method;
@Aspect
@ component
公开课LogAspect {
私有静态最终日志记录器=LoggerFactory.getLogger (LogAspect.class);
@Pointcut (“@annotation (com.boot.aop.config.LogFilter)”)
公共空间logPointCut () {
}
@Around (“logPointCut ()”)
公共对象(ProceedingJoinPoint点)抛出Throwable {
对象的结果=零;
尝试{//执行方法
结果=point.proceed ();//保存请求日志
saveRequestLog(点);
}捕捉(异常e) {//保存异常日志
saveExceptionLog(点,e.getMessage ());
}
返回结果;
}
私人空间saveExceptionLog (ProceedingJoinPoint点,字符串exeMsg) {
LOGGER.info(“捕获异常:“+ exeMsg);
HttpServletRequest请求=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()) .getRequest ();
LOGGER.info(“请求路径:“+ request.getRequestURL ());
MethodSignature签名=(MethodSignature) point.getSignature ();
方法方法=signature.getMethod ();
LOGGER.info(“请求方法:“+ method.getName ());//获取方法上LogFilter注解
LogFilter LogFilter=method.getAnnotation (LogFilter.class);
字符串值=https://www.yisu.com/zixun/logFilter.value ();
LOGGER.info(“模块描述:“+值);
对象[]参数=point.getArgs ();
LOGGER.info(“请求参数:”+ JSONObject.toJSONString (args));
}
私人空间saveRequestLog (ProceedingJoinPoint点){
HttpServletRequest请求=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes ()) .getRequest ();
LOGGER.info(“请求路径:“+ request.getRequestURL ());
MethodSignature签名=(MethodSignature) point.getSignature ();
方法方法=signature.getMethod ();
LOGGER.info(“请求方法:“+ method.getName ());//获取方法上LogFilter注解
LogFilter LogFilter=method.getAnnotation (LogFilter.class);
字符串值=https://www.yisu.com/zixun/logFilter.value ();
LOGGER.info(“模块描述:“+值);
对象[]参数=point.getArgs ();
LOGGER.info(“请求参数:”+ JSONObject.toJSONString (args));
}
}