作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏:Spring5应用专栏_Aomsir的博客
前言
在之前的文章《Spring5应用之AOP动态代理开发》中,我为大家详细地介绍了如何通过四个简单的步骤来实现AOP动态代理的开发。这四个步骤包括:原始类
、额外功能
、切入点
和整合组装
。其中,原始类的开发和整合组装是日常开发中较为常见的内容,因此我们不在此赘述
从本篇文章开始,我会更深入地探讨额外功能和切入点的开发和应用。首先,我们会聚焦于“额外功能”的实现。为了实现这一目标,我们采用了实现MethodBeforeAdvice接口的方法。在接下来的内容中,我将为大家详细解读MethodBeforeAdvice接口
,以及与之相关的另一个接口——MethodInterceptor接口
MethodBeforeAdvice详解
MethodBeforeAdvice接口
是Spring框架专为我们定制的一个接口。一旦实现了这个接口,我们便能够在原始对象的方法执行前添加自定义的附加操作。既然已对该接口的作用有了初步了解,接下来的焦点将放在这个接口中的唯一方法——before方法
上。我们将对此方法以及它的参数进行深入的探讨和分析
- Method method:代表当前额外功能所增加给的那个原始方法,比如login方法、register方法
- Object[] args:代表当前额外功能所增加给的那个原始方法的参数列表,
- Object target:代表当前额外功能所增加给的那个原始对象,比如UserServiceImpl
实战使用
虽然上面已经对before方法的三个参数进行了简要的讲解,但在实际操作中,我们又应该如何使用这些参数呢?实际上,在实战中,我们会根据具体的需求来决定是否使用before方法中的参数。有时,我们可能会使用其中的某一个或某几个参数;而有些时候,这些参数可能一个也用不上。这主要是因为MethodBeforeAdvice接口的设计初衷就是只支持在方法执行前插入额外的功能
MethodInterceptor详解
如前所述,MethodBeforeAdvice接口具备某些局限性,特别是它只允许在原始业务方法执行之前插入附加功能。在某些特定应用场景下,例如性能监测,该接口可能并不完全满足需求。这种设计决策意味着它在某些上下文中可能难以为我们提供强有力的支持。然而,Spring已对此进行了深思熟虑,并相应地推出了MethodInterceptor接口
。此接口赋予我们更广泛的自由度,允许我们在原始方法执行前、执行后,或前后均加入额外功能。这与我们在《Spring5应用之静态代理开发》中手写的静态代理模式颇为相似。另外,值得一提的是,通过使用MethodInterceptor接口
,我们还能对原始方法的返回值进行调整
public class Arround implements MethodInterceptor {
private static final Logger log = LoggerFactory.getLogger(Arround.class);
/**
* 给原始方法添加额外功能(可以运行在原始方法之前或之后),只需要确定原始方法何时执行
* @param methodInvocation 额外功能所添加的原始方法
* @return 代理对象的方法的返回值
* @throws Throwable 异常
*/
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
log.debug("--额外功能----- 原始方法执行之前");
// 运行原始方法,返回值为原始方法的返回值
Object result = null;
try {
result = methodInvocation.proceed();
} catch (Exception e) {
log.error("--额外功能----- 发生异常后的功能", e);
}
log.debug("--额外功能----- 原始方法执行之后");
return result;
}
}
总结
在本文中,我们深入探讨了Spring AOP所提供的两个核心接口——MethodBeforeAdvice
与MethodInterceptor
。这两个接口极大地简化了我们在项目中加入额外功能的过程。与静态代理相比,我们无需创建大量的类进行整合,显著提高了开发的便捷性
参考文献
- 孙哥孙帅suns说Spring5~学不会Spring? 因为你没找对人
- Spring官方文档