Spring AOP阶段
AOP时序图
总体的AOP流程
- AOP是在后置处理器中进行实现的,BanProcessor相关的实现类进行postProcessAfterInitialization方法的重写
- AbstractAutoProxyCreator类实现重写了该方法,核心是实现了wrapIfNecessary方法
- wrapIfNecessary核心方法逻辑
- 先确认是否已经创建过代理对象(earlyProxyReferences,避免对代理对象在进行代理)如果没有,则考虑是否需要进行代理(通过wrapIfNecessary)
- 如果是特殊的Bean 或者之前判断过不用创建代理的Bean则不创建代理否则看是否有匹配的Advise(匹配方式就是上文介绍的通过PointCut或者IntroducationAdvisor可以直接匹配类)
- 如果找到了Advisor,说明需要创建代理,进入createProxy()
- DefaultAopProxyFactory()实现createAopProxy()方法
- 首先会创建ProxyFactory,这个工厂是用来创建AopProxy的,而AopProxy才是用来创建代理对象的。因为底层代理方式有两种(JDK动态代理和CGLIB,对应到AopProxy的实现就是JdkDynamicAopProxy和ObjenesisCglibAopProxy),所以这里使用了一个简单工厂的设计。
- ProxyFactory会设置此次代理的属性,然后根据这些属性选择合适的代理方式,创建代理对象。创建的对象会替换掉被代理对象(Target),被保存在BeanFactory.singletonObjects,因此当有其他Bean希望注入Target时,其实已经被注入了Proxy。
- 代理的选择则判断代理类是否有实现接口,若实现了接口或者本省就是接口,则用JDK动态代理进行实现,否则利用Cglib动态代理实现
Aop阶段是由在初始化方法中的后置处理器进行实现的,父类BeanPostProcessor里面由前置处理方法与后置处理方法
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
关于AOP阶段,是使用了一个子类AbstractAutoProxyCreator,重写了AbstractAutoProxyCreator方法
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware{
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
if (bean != null) {
Object cacheKey = this.getCacheKey(bean.getClass(), beanName);
if (this.earlyProxyReferences.remove(cacheKey) != bean) {
// 核心方法是wrapIfNecessary
return this.wrapIfNecessary(bean, beanName, cacheKey);
}
}
return bean;
}
}
核心方法是wrapIfNecessary方法
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
return bean;
// 判断是否应该代理这个Bean
} else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
// 判断是否是一些InfrastructureClass类或者是否应该跳过这个Bean
// InfrastructureClass就是指Advice、PointCut、Advisor等接口的实现类
// shouldSkip默认是返回false,可以重写
} else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {
// 获取到这个bean的通知
Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
if (specificInterceptors != DO_NOT_PROXY) {
this.advisedBeans.put(cacheKey, Boolean.TRUE);
// 核心类,创建代理
Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
this.proxyTypes.put(cacheKey, proxy.getClass());
return proxy;
} else {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
} else {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
}
创建代理方法,createProxy()方法,里面核心的方法是getProxy()方法
protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) {
if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory)this.beanFactory, beanName, beanClass);
}
// 构建代理工厂
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.copyFrom(this);
if (!proxyFactory.isProxyTargetClass()) {
if (this.shouldProxyTargetClass(beanClass, beanName)) {
proxyFactory.setProxyTargetClass(true);
} else {
this.evaluateProxyInterfaces(beanClass, proxyFactory);
}
}
Advisor[] advisors = this.buildAdvisors(beanName, specificInterceptors);
proxyFactory.addAdvisors(advisors);
proxyFactory.setTargetSource(targetSource);
this.customizeProxyFactory(proxyFactory);
proxyFactory.setFrozen(this.freezeProxy);
if (this.advisorsPreFiltered()) {
proxyFactory.setPreFiltered(true);
}
// 调用getProxy方法进行实现
return proxyFactory.getProxy(this.getProxyClassLoader());
}
getProxy()实现代理,其兜了一圈最后的实现是由DefaultAopProxyFactory中的createAopProxy()方法进行实现的
// ProxyFactory里面的getProxy方法
public Object getProxy(@Nullable ClassLoader classLoader) {
return this.createAopProxy().getProxy(classLoader);
}
// ProxyCreatorSupport的createAopProxy()方法
protected final synchronized AopProxy createAopProxy() {
if (!this.active) {
this.activate();
}
return this.getAopProxyFactory().createAopProxy(this);
}
// getAopProxyFactory()获取到的是一个AopProxyFactory对象
public interface AopProxyFactory {
AopProxy createAopProxy(AdvisedSupport var1) throws AopConfigException;
}
// DefaultAopProxyFactory()实现createAopProxy()方法
// 判断是否有实现接口,若实现了接口或者本省就是接口,则用JDK动态代理进行实现,否则利用Cglib动态代理实现
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {
return new JdkDynamicAopProxy(config);
} else {
Class<?> targetClass = config.getTargetClass();
if (targetClass == null) {
throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
} else {
return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
}
}
}
private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
Class<?>[] ifcs = config.getProxiedInterfaces();
return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
}
JDK代理的实现逻辑
- 首先就是基本的配置,将adviced对象配置的,加上对应的SpringProxy及其Advised的属性
- 调用Proxy.newProxyInstance()创建代理对象
- 核心方法是invoke方法进行切面的织入
- 先找到目标类的拦截器列表
- 若有拦截器,则直接进行Method.invoke()方法的实现
- 若没有拦截器,创建ReflectiveMethodInvocation对象,反射执行拦截点
- 最后通过Spring预先设计好的拦截器进行实现
public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException {
Assert.notNull(config, "AdvisedSupport must not be null");
if (config.getAdvisorCount() == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) {
throw new AopConfigException("No advisors and no TargetSource specified");
} else {
this.advised = config;
// 除了Advised对象配置的,还会加上SpringProxy、Advised(opaque=false)
this.proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
// 检查得到的接口有没有定义equals与hashcode的接口
this.findDefinedEqualsAndHashCodeMethods(this.proxiedInterfaces);
}
}
// 获取代理对象
// 通过Proxy.newProxyInstance()创建代理对象
public Object getProxy(@Nullable ClassLoader classLoader) {
if (logger.isTraceEnabled()) {
logger.trace("Creating JDK dynamic proxy: " + this.advised.getTargetSource());
}
return Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this);
}
invoke方法实现切换的织入
- 先找到目标类的拦截器列表
- 若有拦截器,则直接进行Method.invoke()方法的实现
- 若没有拦截器,创建ReflectiveMethodInvocation对象,反射执行拦截点
// 1、核心的invoke方法
@Nullable
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object oldProxy = null;
boolean setProxyContext = false;
TargetSource targetSource = this.advised.targetSource;
Object target = null;
Object var12;
try {
// 目标对象未实现equals()方法
if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) {
Boolean var18 = this.equals(args[0]);
return var18;
}
// 目标对象未实现hashcode()方法
if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) {
Integer var17 = this.hashCode();
return var17;
}
if (method.getDeclaringClass() == DecoratingProxy.class) {
Class var16 = AopProxyUtils.ultimateTargetClass(this.advised);
return var16;
}
Object retVal;
// 直接反射调用Advised接口或者父接口中定义的方法,不应用通知
if (!this.advised.opaque && method.getDeclaringClass().isInterface() && method.getDeclaringClass().isAssignableFrom(Advised.class)) {
retVal = AopUtils.invokeJoinpointUsingReflection(this.advised, method, args);
return retVal;
}
if (this.advised.exposeProxy) {
oldProxy = AopContext.setCurrentProxy(proxy);
setProxyContext = true;
}
// 获取到目标类
target = targetSource.getTarget();
Class<?> targetClass = target != null ? target.getClass() : null;
//2、 获取到可以应用到该方法的拦截器列表
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
if (chain.isEmpty()) {
// 3、如果没有可以应用到此方法上的拦截器,则直接反射调用Method.invoke()方法
Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);
retVal = AopUtils.invokeJoinpointUsingReflection(target, method, argsToUse);
} else {
// 4、如果有的话,则进行ReflectiveMethodInvocation的创建,执行拦截器的方法
MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
retVal = invocation.proceed();
}
Class<?> returnType = method.getReturnType();
if (retVal != null && retVal == target && returnType != Object.class && returnType.isInstance(proxy) && !RawTargetAccess.class.isAssignableFrom(method.getDeclaringClass())) {
retVal = proxy;
} else if (retVal == null && returnType != Void.TYPE && returnType.isPrimitive()) {
throw new AopInvocationException("Null return value from advice does not match primitive return type for: " + method);
}
var12 = retVal;
} finally {
if (target != null && !targetSource.isStatic()) {
targetSource.releaseTarget(target);
}
if (setProxyContext) {
AopContext.setCurrentProxy(oldProxy);
}
}
return var12;
}
// 2、AdvisedSupport里面的获取指定方法的拦截器getInterceptorsAndDynamicInterceptionAdvice方法
// 获取到的结果会被缓存下来,若之前没有缓存的数据,则调用核心方法getInterceptorsAndDynamicInterceptionAdvice
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, @Nullable Class<?> targetClass) {
AdvisedSupport.MethodCacheKey cacheKey = new AdvisedSupport.MethodCacheKey(method);
List<Object> cached = (List)this.methodCache.get(cacheKey);
if (cached == null) {
// 2.1 AdvisorChainFactory接口中的抽象方法getInterceptorsAndDynamicInterceptionAdvice
cached = this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(this, method, targetClass);
this.methodCache.put(cacheKey, cached);
}
return cached;
}
// 2.1 该方法由AdvisorChainFactory接口的实现类DefaultAdvisorChainFactory实现
// 从提供给的实例config中获取Advisor接口,遍历这些advisor,如果advisor是IntroductionAdvisor,则判断该Advisor是否可以应用到targetclass上
// 如果advisor是PointcutAdvisor,则判断该Advisor是否可以应用到目标方法上
// 将满足的Advisor通过AdvisorAdapter转换为拦截器列表返回
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, @Nullable Class<?> targetClass) {
// 5 实际上就是测试一系列的AdvisorAdapter,用于将Advisor转换为MethodInterceptor
AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
// 获取config实例的advisor李白
Advisor[] advisors = config.getAdvisors();
List<Object> interceptorList = new ArrayList(advisors.length);
Class<?> actualClass = targetClass != null ? targetClass : method.getDeclaringClass();
Boolean hasIntroductions = null;
Advisor[] var9 = advisors;
int var10 = advisors.length;
// 遍历
for(int var11 = 0; var11 < var10; ++var11) {
Advisor advisor = var9[var11];
// 如果是PointcutAdvisor
if (advisor instanceof PointcutAdvisor) {
PointcutAdvisor pointcutAdvisor = (PointcutAdvisor)advisor;
if (config.isPreFiltered() || pointcutAdvisor.getPointcut().getClassFilter().matches(actualClass)) {
MethodMatcher mm = pointcutAdvisor.getPointcut().getMethodMatcher();
boolean match;
if (mm instanceof IntroductionAwareMethodMatcher) {
if (hasIntroductions == null) {
hasIntroductions = hasMatchingIntroductions(advisors, actualClass);
}
// 看是否可以用到目标方法method上
match = ((IntroductionAwareMethodMatcher)mm).matches(method, actualClass, hasIntroductions);
} else {
match = mm.matches(method, actualClass);
}
if (match) {
//registry.getInterceptors方法里面的核心就是利用AdvisorAdapter将advisor转换为拦截器列表返回
MethodInterceptor[] interceptors = registry.getInterceptors(advisor);
if (mm.isRuntime()) {
MethodInterceptor[] var17 = interceptors;
int var18 = interceptors.length;
for(int var19 = 0; var19 < var18; ++var19) {
MethodInterceptor interceptor = var17[var19];
interceptorList.add(new InterceptorAndDynamicMethodMatcher(interceptor, mm));
}
} else {
interceptorList.addAll(Arrays.asList(interceptors));
}
}
}
// 如果是IntroductionAdvisor
} else if (advisor instanceof IntroductionAdvisor) {
IntroductionAdvisor ia = (IntroductionAdvisor)advisor;
// 如果可以利用到目标类上
if (config.isPreFiltered() || ia.getClassFilter().matches(actualClass)) {
//registry.getInterceptors方法里面的核心就是利用AdvisorAdapter将advisor转换为拦截器列表返回
Interceptor[] interceptors = registry.getInterceptors(advisor);
interceptorList.addAll(Arrays.asList(interceptors));
}
} else {
Interceptor[] interceptors = registry.getInterceptors(advisor);
interceptorList.addAll(Arrays.asList(interceptors));
}
}
return interceptorList;
}
//3、 AOPUtils里面的invokeJoinpointUsingReflection方法
// 如果没有可以应用到此方法上的拦截器,则直接反射调用Method.invoke()方法
@Nullable
public static Object invokeJoinpointUsingReflection(@Nullable Object target, Method method, Object[] args) throws Throwable {
try {
ReflectionUtils.makeAccessible(method);
return method.invoke(target, args);
} catch (InvocationTargetException var4) {
throw var4.getTargetException();
} catch (IllegalArgumentException var5) {
throw new AopInvocationException("AOP configuration seems to be invalid: tried calling method [" + method + "] on target [" + target + "]", var5);
} catch (IllegalAccessException var6) {
throw new AopInvocationException("Could not access method [" + method + "]", var6);
}
}
//4、ReflectiveMethodInvocation类中构造函数及其proceed()方法
protected ReflectiveMethodInvocation(Object proxy, @Nullable Object target, Method method, @Nullable Object[] arguments, @Nullable Class<?> targetClass, List<Object> interceptorsAndDynamicMethodMatchers) {
this.proxy = proxy;
this.target = target;
this.targetClass = targetClass;
this.method = BridgeMethodResolver.findBridgedMethod(method);
this.arguments = AopProxyUtils.adaptArgumentsIfNecessary(method, arguments);
this.interceptorsAndDynamicMethodMatchers = interceptorsAndDynamicMethodMatchers;
}
@Nullable
public Object proceed() throws Throwable {
// 如果拦截器执行完了,就该执行连接点了
if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
return this.invokeJoinpoint();
} else {
Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
InterceptorAndDynamicMethodMatcher dm = (InterceptorAndDynamicMethodMatcher)interceptorOrInterceptionAdvice;
Class<?> targetClass = this.targetClass != null ? this.targetClass : this.method.getDeclaringClass();
// 动态匹配,运行时参数是否满足匹配条件
// 动态匹配失败时,略过当前拦截器,调用下一个拦截器
return dm.methodMatcher.matches(this.method, targetClass, this.arguments) ? dm.interceptor.invoke(this) : this.proceed();
} else {
// 执行当前拦截i器
return ((MethodInterceptor)interceptorOrInterceptionAdvice).invoke(this);
}
}
}
在获取Advisor的拦截器的时候,用到了注册AdvisorAdapter,用于将Advisor转换为MethonInterceptor
GlobalAdvisorAdapterRegistry()提供一个DefaultAdvisorAdapterRegistry类,来完成各种通知的适配和注册过程
//5、 GlobalAdvisorAdapterRegistry 类负责拦截器的适配与注册过程
AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance();
// GlobalAdvisorAdapterRegistry类
public final class GlobalAdvisorAdapterRegistry {
// DefaultAdvisorAdapterRegistry 完成了各种通知的适配与注册过程
private static AdvisorAdapterRegistry instance = new DefaultAdvisorAdapterRegistry();
private GlobalAdvisorAdapterRegistry() {
}
public static AdvisorAdapterRegistry getInstance() {
return instance;
}
static void reset() {
instance = new DefaultAdvisorAdapterRegistry();
}
}
// DefaultAdvisorAdapterRegistry类
public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable {
private final List<AdvisorAdapter> adapters = new ArrayList(3);
public DefaultAdvisorAdapterRegistry() {
// 方法执行前
this.registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
// 方法正常返回
this.registerAdvisorAdapter(new AfterReturningAdviceAdapter());
// 方法异常
this.registerAdvisorAdapter(new ThrowsAdviceAdapter());
}
public void registerAdvisorAdapter(AdvisorAdapter adapter) {
this.adapters.add(adapter);
}
public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {
if (adviceObject instanceof Advisor) {
return (Advisor)adviceObject;
} else if (!(adviceObject instanceof Advice)) {
throw new UnknownAdviceTypeException(adviceObject);
} else {
Advice advice = (Advice)adviceObject;
if (advice instanceof MethodInterceptor) {
return new DefaultPointcutAdvisor(advice);
} else {
Iterator var3 = this.adapters.iterator();
AdvisorAdapter adapter;
do {
if (!var3.hasNext()) {
throw new UnknownAdviceTypeException(advice);
}
adapter = (AdvisorAdapter)var3.next();
} while(!adapter.supportsAdvice(advice));
return new DefaultPointcutAdvisor(advice);
}
}
}
public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException {
List<MethodInterceptor> interceptors = new ArrayList(3);
Advice advice = advisor.getAdvice();
if (advice instanceof MethodInterceptor) {
interceptors.add((MethodInterceptor)advice);
}
Iterator var4 = this.adapters.iterator();
while(var4.hasNext()) {
AdvisorAdapter adapter = (AdvisorAdapter)var4.next();
if (adapter.supportsAdvice(advice)) {
interceptors.add(adapter.getInterceptor(advisor));
}
}
if (interceptors.isEmpty()) {
throw new UnknownAdviceTypeException(advisor.getAdvice());
} else {
return (MethodInterceptor[])interceptors.toArray(new MethodInterceptor[0]);
}
}
}
方法执行前、正常返回、异常返回
// MethodBeforeAdviceAdapter 处理目标对象处理前的增强
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
MethodBeforeAdviceAdapter() {
}
public boolean supportsAdvice(Advice advice) {
return advice instanceof MethodBeforeAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice)advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable {
private final MethodBeforeAdvice advice;
public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
Assert.notNull(advice, "Advice must not be null");
this.advice = advice;
}
@Nullable
public Object invoke(MethodInvocation mi) throws Throwable {
// 在方法执行前,也就是proceed方法前先调用advice的before
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
return mi.proceed();
}
}
// 方法执行正常返回
class AfterReturningAdviceAdapter implements AdvisorAdapter, Serializable {
AfterReturningAdviceAdapter() {
}
public boolean supportsAdvice(Advice advice) {
return advice instanceof AfterReturningAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
AfterReturningAdvice advice = (AfterReturningAdvice)advisor.getAdvice();
return new AfterReturningAdviceInterceptor(advice);
}
}
public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {
private final AfterReturningAdvice advice;
public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
Assert.notNull(advice, "Advice must not be null");
this.advice = advice;
}
@Nullable
public Object invoke(MethodInvocation mi) throws Throwable {
Object retVal = mi.proceed();
// 在方法执行后,也就是proceed方法后调用advice的afterReturning
this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
return retVal;
}
}
// 方法异常后返回
class ThrowsAdviceAdapter implements AdvisorAdapter, Serializable {
ThrowsAdviceAdapter() {
}
public boolean supportsAdvice(Advice advice) {
return advice instanceof ThrowsAdvice;
}
public MethodInterceptor getInterceptor(Advisor advisor) {
return new ThrowsAdviceInterceptor(advisor.getAdvice());
}
}
public class ThrowsAdviceInterceptor implements MethodInterceptor, AfterAdvice {
private static final String AFTER_THROWING = "afterThrowing";
private static final Log logger = LogFactory.getLog(ThrowsAdviceInterceptor.class);
private final Object throwsAdvice;
private final Map<Class<?>, Method> exceptionHandlerMap = new HashMap();
public ThrowsAdviceInterceptor(Object throwsAdvice) {
Assert.notNull(throwsAdvice, "Advice must not be null");
this.throwsAdvice = throwsAdvice;
Method[] methods = throwsAdvice.getClass().getMethods();
Method[] var3 = methods;
int var4 = methods.length;
for(int var5 = 0; var5 < var4; ++var5) {
Method method = var3[var5];
if (method.getName().equals("afterThrowing") && (method.getParameterCount() == 1 || method.getParameterCount() == 4)) {
Class<?> throwableParam = method.getParameterTypes()[method.getParameterCount() - 1];
if (Throwable.class.isAssignableFrom(throwableParam)) {
this.exceptionHandlerMap.put(throwableParam, method);
if (logger.isDebugEnabled()) {
logger.debug("Found exception handler method on throws advice: " + method);
}
}
}
}
if (this.exceptionHandlerMap.isEmpty()) {
throw new IllegalArgumentException("At least one handler method must be found in class [" + throwsAdvice.getClass() + "]");
}
}
@Nullable
public Object invoke(MethodInvocation mi) throws Throwable {
try {
// 对执行进行异常捕捉
return mi.proceed();
} catch (Throwable var4) {
Method handlerMethod = this.getExceptionHandler(var4);
if (handlerMethod != null) {
this.invokeHandlerMethod(mi, var4, handlerMethod);
}
throw var4;
}
}
private void invokeHandlerMethod(MethodInvocation mi, Throwable ex, Method method) throws Throwable {
Object[] handlerArgs;
if (method.getParameterCount() == 1) {
handlerArgs = new Object[]{ex};
} else {
handlerArgs = new Object[]{mi.getMethod(), mi.getArguments(), mi.getThis(), ex};
}
try {
method.invoke(this.throwsAdvice, handlerArgs);
} catch (InvocationTargetException var6) {
throw var6.getTargetException();
}
}
}