天天看点

Spring源码:AbstractAspectJAdvice抽象类

文章目录

        • AbstractAspectJAdvice抽象类
        • 扩展类

AbstractAspectJAdvice抽象类

用途:AOP基类,用来包装AspectJ切面或AspectJ注解的通知方法

public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedenceInformation, Serializable {
	private final Class<?> declaringClass;
	private final String methodName;
	private final Class<?>[] parameterTypes;
	protected transient Method aspectJAdviceMethod;
   // 切点
	private final AspectJExpressionPointcut pointcut;
	private final AspectInstanceFactory aspectInstanceFactory;
	// 切面名称
	private String aspectName;
	// 切面顺序
	private int declarationOrder;
    //......
}
                

扩展类

  • **AspectJMethodBeforeAdvice类:**Spring AOP advice that wraps an AspectJ before method.
    public class AspectJMethodBeforeAdvice extends AbstractAspectJAdvice implements MethodBeforeAdvice, Serializable {
        // 构造函数
    
    	@Override
    	public void before(Method method, Object[] args, Object target) throws Throwable {
    		invokeAdviceMethod(getJoinPointMatch(), null, null);
    	}
    
    	@Override
    	public boolean isBeforeAdvice() {
    		return true;
    	}
    	@Override
    	public boolean isAfterAdvice() {
    		return false;
    	}
    }
                    
  • AspectJAfterAdvice类:Spring AOP advice wrapping an AspectJ after advice method.
    public class AspectJAfterAdvice extends AbstractAspectJAdvice
    		implements MethodInterceptor, AfterAdvice, Serializable {
    		
        // 构造函数
        
    	@Override
    	public Object invoke(MethodInvocation mi) throws Throwable {
    		try {
    			return mi.proceed();
    		}
    		finally {
    			invokeAdviceMethod(getJoinPointMatch(), null, null);
    		}
    	}
    
    	@Override
    	public boolean isBeforeAdvice() {
    		return false;
    	}
    
    	@Override
    	public boolean isAfterAdvice() {
    		return true;
    	}
    }
                    
  • **AspectJAfterReturningAdvice类:**Spring AOP advice wrapping an AspectJ after-returning advice method.
    public class AspectJAfterReturningAdvice extends AbstractAspectJAdvice
    		implements AfterReturningAdvice, AfterAdvice, Serializable {
    	// 构造函数
    
    	@Override
    	public boolean isBeforeAdvice() {
    		return false;
    	}
    
    	@Override
    	public boolean isAfterAdvice() {
    		return true;
    	}
    
    	@Override
    	public void setReturningName(String name) {
    		setReturningNameNoCheck(name);
    	}
    
    	@Override
    	public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
    		if (shouldInvokeOnReturnValueOf(method, returnValue)) {
    			invokeAdviceMethod(getJoinPointMatch(), returnValue, null);
    		}
    	}
    	//......
    }
                    
  • **AspectJAfterThrowingAdvice类:**Spring AOP advice wrapping an AspectJ after-throwing advice method.
    public class AspectJAfterThrowingAdvice extends AbstractAspectJAdvice
    		implements MethodInterceptor, AfterAdvice, Serializable {
    		// 构造函数
    	@Override
    	public boolean isBeforeAdvice() {
    		return false;
    	}
    
    	@Override
    	public boolean isAfterAdvice() {
    		return true;
    	}
    
    	@Override
    	public void setThrowingName(String name) {
    		setThrowingNameNoCheck(name);
    	}
    
    	@Override
    	public Object invoke(MethodInvocation mi) throws Throwable {
    		try {
    			return mi.proceed();
    		}
    		catch (Throwable ex) {
    			if (shouldInvokeOnThrowing(ex)) {
    				invokeAdviceMethod(getJoinPointMatch(), null, ex);
    			}
    			throw ex;
    		}
    	}
    	//......
    }
                    
  • **AspectJAroundAdvice类:**Spring AOP around advice (MethodInterceptor) that wraps an AspectJ advice method. Exposes ProceedingJoinPoint.
    public class AspectJAroundAdvice extends AbstractAspectJAdvice implements MethodInterceptor, Serializable {
        // 构造函数
    	@Override
    	public boolean isBeforeAdvice() {
    		return false;
    	}
    
    	@Override
    	public boolean isAfterAdvice() {
    		return false;
    	}
    
    	@Override
    	protected boolean supportsProceedingJoinPoint() {
    		return true;
    	}
    
    	@Override
    	public Object invoke(MethodInvocation mi) throws Throwable {
    		ProxyMethodInvocation pmi = (ProxyMethodInvocation) mi;
    		ProceedingJoinPoint pjp = lazyGetProceedingJoinPoint(pmi);
    		JoinPointMatch jpm = getJoinPointMatch(pmi);
    		return invokeAdviceMethod(pjp, jpm, null, null);
    	}
        //.......
    }