package com.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
/**
*
* 定义切面对象类型 特点
* 1.使用@Aspect注释修饰
* 2.切面内部包含切入点和通知的定义
* 2.1通过Pointcut注解定义切入点通常会对某个类或多个类中的方法的集合
* 2.2通过@Around等注解描述的方法为通知方法(此方法内部要实现扩展业务的植入)
* @title: SysLogAspect
* @Author
* @Date: 2021/8/5 19:47
*/
@Aspect
@Component
@Slf4j
public class SysLogAspect {
/**
* bean(bean名称)为一个切入点表达式
*/
@Pointcut("bean(orderServiceImpl)")
public void doLogPointCut(){}
// @Around() --> @Before() --> @After() --> @AfterReturning
@Before("doLogPointCut()")
public void doBefore(JoinPoint jp){
System.out.println("before通知 输出的值 :"+jp.getTarget());
}
@After("doLogPointCut()")
public void doAfter(JoinPoint jp){
System.out.println("after通知输出的值:"+jp.getKind());
}
@AfterReturning("doLogPointCut()")
public void doAfterReturning(JoinPoint jp){
System.out.println("AfterReturning 通知输出的值:"+jp.toLongString());
}
/**
* 环绕通知方法(这个内部方法方法可以在方法执行之前,之后添加扩展业务逻辑)
* @param jp 连接点(封装了切入点中某个正在执行的方法信息)
* @return 为目标方法的执行结果
*/
@Around("doLogPointCut()")
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
log.info("start {}",System.currentTimeMillis());
try {
//调动逻辑--》本类中其他通知--》其他切面--》目标方法
Object result = jp.proceed();
log.info("end {}",System.currentTimeMillis());
return result;
}catch (Throwable e){
log.error("error {}",e.getMessage());
throw e;
}
}
}
读懂aop
最新推荐文章于 2022-12-30 16:53:46 发布