微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。
目录
代码块1:ReflectiveMethodInvocation 构造函数
代码块2:ReflectiveMethodInvocation#proceed()
代码块4:ExposeInvocationInterceptor#invoke
代码块5:AspectJAroundAdvice#invoke
代码块8:invokeAdviceMethodWithGivenArgs
前言
在上篇文章中,我们介绍了 AOP 代理的创建:Spring AOP源码学习:创建 AOP 代理,本文将介绍最后的一个重要内容:使用了 AOP 代理的方法的一次完整调用流程。
正文
关于使用的 AOP 增强方式,本文以最常使用的 @Around 作为例子进行介绍,如下代码。
@Aspect
@Component
public class LogInterceptor {
@Pointcut("execution(* com.joonwhee.open.service..*.*(..))")
public void pointcut() {
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object[] args = pjp.getArgs();
try {
System.out.println("入参=" + JSON.toJSONString(args));
long start = System.currentTimeMillis();
Object result = pjp.proceed();
System.out.println("耗时=" + (System.currentTimeMillis() - start));
System.out.println("回参=" + JSON.toJSONString(result));
return result;
} catch (Exception e) {
return "";
}
}
}
关于被代理的方法,使用下面的 getName(String name) 作为例子进行介绍,如下代码。
@Service
public class UserServiceImpl implements UserService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
@Override
public String getName(String name) {
LOGGER.info("UserServiceImpl#getName入参, name={}", name);
String result = "name: " + name;