今天就别人写的代码重新理解一下 spring 的aop 。
以下为自己的理解和网上的一些来源,不保证绝对正确,若有错误欢迎指正
https://gitee.com/yidao620/springboot-bucket?_from=gitee_search
Aspect 切面
切面是散落在系统各处通用的业务逻辑代码,如日志模块、权限模块、事务模块等。
切面用来装载切入点PointCut和通知Advice
切面通常是一个类,可以定义切入点和通知。类是对物体特征的抽象,切面是对横切关注点的抽象。
切面是业务流程运行的某个特定步骤,是应用运行过程中的关注点,关注点通常会横切多个对象,因此也被称为横切关注点。
JointPoint 连接点
连接点是程序执行过程中明确的点,一般是类中方法的调用。连接点是程序在运行过程中能够插入切面的地点,比如方法调用、异常抛出、字段修改等。
PointCut 切入点
切入点是带有通知的连接点,在程序中主要体现为编写切入点表达式。切入点是对连接点进行拦截的定义。切入点用于定义通知应该切入到哪些连接点上,不同的通知需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
切入点是可以插入增强处理的连接点,当某个连接点满足执行要求时,该连接点将被连接增强处理,该连接点也就变成了切入点。
切入点是拦截的方法,连接点JointPoint拦截后将变成切入点。
/**
* 日志切面
*/
@Aspect
@Component
public class LogAspect {
@Pointcut("execution(public * com.xncoding.aop.controller.*.*(..))")
public void webLog(){}
}
LogAspect装载切入点PointCut和通知Advice,定义了切入点和通知,比如日志切面 ,包含了切入点webLog带有通知的连接点,是拦截的方法,是由连接点JointPoint拦截后变成切入点。
Advice 通知
通知是AOP在特定切入点上执行的增强处理,是拦截到连接点之后要执行的代码,通知可以分为前置通知Before、后置通知AfterReturning、异常通知AfterThrowing、最终通知After、环绕通知Around五类。
@Before("webLog()")
public void deBefore(JoinPoint joinPoint) throws Throwable {
// 接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 记录下请求内容
System.out.println("URL : " + request.getRequestURL().toString());
System.out.println("HTTP_METHOD : " + request.getMethod());
System.out.println("IP : " + request.getRemoteAddr());
System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs()));
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
// 处理完请求,返回内容
System.out.println("方法的返回值 : " + ret);
}
//后置异常通知
@AfterThrowing("webLog()")
public void throwss(JoinPoint jp){
System.out.println("方法异常时执行.....");
}
//后置最终通知,final增强,不管是抛出异常或者正常退出都会执行
@After("webLog()")
public void after(JoinPoint jp){
System.out.println("方法最后执行.....");
}
//环绕通知,环绕增强,相当于MethodInterceptor
@Around("webLog()")
public Object arround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("方法环绕start.....");
try {
Object o = pjp.proceed();
System.out.println("方法环绕proceed,结果是 :" + o);
return o;
} catch (Throwable e) {
throw e;
}
}
通知顺序
问题:java.lang.IllegalStateException: Cannot load configuration class: com.xncoding.pos.Application
回答:修改jdk为1.8
参考:
链接1:https://www.jianshu.com/p/f1770b9dce27
链接2:https://blog.csdn.net/weixin_45727359/article/details/123606337