简介
在Spring框架的AOP(面向切面编程)中,Advice接口是定义通知行为的抽象。然而,在Spring的实际实现中,Advice接口并没有直接被使用。相反,我们更常见的是MethodInterceptor接口、BeforeAdvice接口、AfterAdvice接口等,这些都是Advice接口的不同实现或与之相关的接口。这些接口定义了在方法执行的不同时刻(如方法执行前、方法执行后、方法抛出异常时等)执行的操作。
下面我将对Spring AOP中的一些关键接口和类进行解析:
MethodInterceptor:
- 这是Advice的一种实现方式,用于拦截目标方法。
- 它有一个invoke方法,该方法在目标方法执行前后提供插入自定义逻辑的机会。
- invoke方法接受一个MethodInvocation对象,该对象封装了目标方法、方法参数等信息。
BeforeAdvice:
- 在目标方法执行前执行的操作。
- 常见的实现是MethodBeforeAdvice,它有一个before方法,该方法在目标方法调用之前被调用。
AfterAdvice:
- 在目标方法执行后执行的操作。
- Spring AOP提供了AfterReturningAdvice和AfterThrowingAdvice两种实现:
- AfterReturningAdvice:在方法正常返回后执行。
- AfterThrowingAdvice:在方法抛出异常后执行。
Aspect:
- 在Spring AOP中,切面是一个包含了通知和切点的对象。
- 切面可以将多个通知(如前置通知、后置通知等)关联到一个或多个切点。
- 在Spring中,通常使用注解(如@Aspect、@Before、@After等)来定义切面。
Pointcut:
- 切点定义了何时应该执行通知。
- 切点通常使用表达式来匹配目标方法,例如基于方法的名称、所在的包或类、参数类型等。
- 在Spring中,切点可以使用注解(如@Pointcut)或XML配置来定义。
Advisor:
- 顾问是一个包含了通知和切点的对象,它决定了何时何地应用通知。
- 在Spring中,可以通过DefaultPointcutAdvisor或DefaultBeanFactoryPointcutAdvisor等类来创建顾问。
ProxyFactory 和 ProxyFactoryBean:
- 这些类用于创建代理对象,该对象会拦截对目标方法的调用,并在适当的时候执行通知。
- ProxyFactory提供了更多的配置选项,而ProxyFactoryBean则是一个Spring Bean,可以在Spring配置文件中直接使用。
使用Spring AOP时,你通常会定义切面(包含通知和切点),然后将这些切面配置到Spring容器中。Spring会根据这些配置自动创建代理对象,并在运行时拦截目标方法的调用,执行相应的通知逻辑。
源码
//通知接口 一种标识
public interface Advice {}
//前置通知
public interface BeforeAdvice extends Advice {}
//最终通知
public interface AfterAdvice extends Advice {}
//后置通知
public interface AfterReturningAdvice extends AfterAdvice {/*** returnValue:返回值* method:拦截方法* args:方法参数* target:目标对象*/void afterReturning(@Nullable Object returnValue, Method method, Object[] args, @Nullable Object target) throws Throwable;}
//异常通知
public interface ThrowsAdvice extends AfterAdvice {}