待执行目标方法:
public void test(){
log.info("方法执行test- > " );
//return false;
}
@Aspect
@Component
@Slf4j
public class KevinAspect {
private long startTime;
private long endTime;
/**
* 声明一个切点
*/
//@Pointcut("execution(* geektime.spring.springbucks.repository..*(..))")
@Pointcut("execution(* geektime.spring.springbucks.service..*(..))")
private void kevin(){
log.info("Pointcut startTime:{},endTime:{}" ,startTime, endTime);
}
/**
* 程序执行之前
*/
@Before("kevin()")
public void before(){
this.startTime = System.currentTimeMillis();
log.info("before startTime:{},endTime:{}" ,startTime, endTime);
}
/**
* 程序执行之后
*/
@After("kevin()")
public void after(){
this.endTime = System.currentTimeMillis();
log.info("after startTime:{},endTime:{},程序执行时间->{}ms" ,startTime, endTime,endTime-startTime);
}
@Around("kevin()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
log.info("around startTime:{},endTime:{}" ,startTime, endTime);
return proceedingJoinPoint.proceed();
// return null;
}
}
执行结果:
2019-03-20 16:03:19.558 INFO 12792 --- [ main] g.spring.springbucks.aspect.KevinAspect : around startTime:0,endTime:0
2019-03-20 16:03:19.559 INFO 12792 --- [ main] g.spring.springbucks.aspect.KevinAspect : before startTime:1553068999559,endTime:0
2019-03-20 16:03:19.564 INFO 12792 --- [ main] g.s.springbucks.service.CoffeeService : 方法执行test- >
2019-03-20 16:03:19.564 INFO 12792 --- [ main] g.spring.springbucks.aspect.KevinAspect : after startTime:1553068999559,endTime:1553068999564,程序执行时间->5ms
如果不执行proceedingJoinPoint.proceed()方法,那么目标方法不会执行
package geektime.spring.springbucks.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;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* @Author kevin
* @Description 自定义切面
* @DATE Created on 2019-03-20 10:18
*/
@Aspect
@Component
@Slf4j
public class KevinAspect {
private long startTime;
private long endTime;
/**
* 声明一个切点
*/
//@Pointcut("execution(* geektime.spring.springbucks.repository..*(..))")
@Pointcut("execution(* geektime.spring.springbucks.service..*(..))")
private void kevin(){
log.info("Pointcut startTime:{},endTime:{}" ,startTime, endTime);
}
/**
* 程序执行之前
*/
@Before("kevin()")
public void before(){
this.startTime = System.currentTimeMillis();
log.info("before startTime:{},endTime:{}" ,startTime, endTime);
}
/**
* 程序执行之后
*/
@After("kevin()")
public void after(){
this.endTime = System.currentTimeMillis();
log.info("after startTime:{},endTime:{},程序执行时间->{}ms" ,startTime, endTime,endTime-startTime);
}
@Around("kevin()")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
log.info("around startTime:{},endTime:{}" ,startTime, endTime);
//return proceedingJoinPoint.proceed();
return null;
}
}
执行结果:
2019-03-20 16:04:25.210 INFO 1492 --- [ main] g.spring.springbucks.aspect.KevinAspect : around startTime:0,endTime:0
2019-03-20 16:04:25.210 INFO 1492 --- [ main] g.spring.springbucks.aspect.KevinAspect : after startTime:0,endTime:1553069065210,程序执行时间->1553069065210ms
结论:
环绕通知 ProceedingJoinPoint 执行proceed方法的作用是让目标方法执行,这也是环绕通知和前置、后置通知方法的一个最大区别。简单理解,环绕通知=前置+目标方法执行+后置通知,proceed方法就是用于启动目标方法执行的