spring 注解式 aop实现, 及其运行流程源码解读

说明: 看源码流程时, 希望各位同学能自己跟着流程走几遍, 别人理解的终究是别人的. 只有自己真正看过才能加深理解

Aspect Class

package com.yangyun.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.Arrays;

/**
 * @ClassName LogAspect
 * @Description:
 * @Author 86155
 * @Date 2020/1/19 10:04
 * @Version 1.0
 **/
@Aspect // 标注为切面类
public class LogAspect {

    /**
     * @Author yangyun
     * @Description:  公共的切入点表达式; 表示在方法执行时触发CalculateService下任意方法, 任意参数, 任意返回值类型
     * @Date 2020/1/19 10:14
     * @Param [point]
     * @returnm void
     **/
    @Pointcut("execution(public * com.yangyun.aop.CalculateService.*(..))")
    public void pointCut(){

    }


    @Before("pointCut()")
    public void logStart(JoinPoint point){
        Object[] args = point.getArgs();
        System.out.println("@Before执行方法: " + point.getSignature().getName() + ", 参数{"+ Arrays.asList(args) +"}");
    }

    @After("pointCut()")
    public void logEnd(JoinPoint point){
        System.out.println("@After执行方法: " + point.getSignature().getName());
    }

    // result 为指定的接收方法的返回值
    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturning(JoinPoint point, Object result){

    }

    // exception 目标方法出现异常时接收
    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void logThrowing(JoinPoint point, Exception exception){
        System.out.println("@AfterThrowing"+point.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
    }
}

Service

package com.yangyun.aop;

import org.springframework.stereotype.Service;

/**
 * @ClassName CalculateService
 * @Description:
 * @Author 86155
 * @Date 2020/1/19 10:03
 * @Version 1.0
 **/
@Service
public class CalculateService {

    public int div(int i, int j){
        System.out.println("processing target method..");
        return i/j;
    }
}

Configuration

package com.yangyun.config;

import com.yangyun.aop.CalculateService;
import com.yangyun.aop.LogAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * @ClassName MainAopConfig
 * @Description:
 * @Author 86155
 * @Date 2020/1/19 10:02
 * @Version 1.0
 **/
@EnableAspectJAutoProxy // 开启基于注解版的aop功能
@Configuration
public class MainAopConfig {

    @Bean
    public CalculateService calculateService (){

        return new CalculateService();
    }

    @Bean
    public LogAspect logAspect (){
        return new LogAspect();
    }

}

aop运行流程

分析

  1. 开启基于注解的aop功能需要@EnableAspectJAutoProxy
    1. @Import(AspectJAutoProxyRegistrar.class) 给容器中导入AspectJAutoProxyRegistrar, 利用 AspectJAutoProxyRegistrar自定义给容器中注册 bean(BeanDefinitionRegistry)
    2. class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar(
      	AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
      	public void registerBeanDefinitions(
              // 如果必要就注册 AspectJAnnotationAutoProxyCreator
          	AopConfigUtils.
              	registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);    
          }
      }

       

    3. 给容器中注册 AnnotationAwareAspectJAutoProxyCreator
  2. AnnotationAwareAspectJAutoProxyCreator, 实际上 是一个bean后置处理器
    1. internalAutowiredAnnotationProcessor = AnnotationAwareAspectJAutoProxyCreator --> AspectJAwareAdvisorAutoProxyCreator --> AbstractAdvisorAutoProxyCreator --> AbstractAutoProxyCreator --> implements SmartInstantiationAwareBeanPostProcessorg

流程

  1. 根据配置类创建 IOC 容器
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainAopConfig.class);

     

  2. 注册配置类, 刷新容器
    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        this();
        register(annotatedClasses);
        refresh();
    }

     

  3. registerBeanPostProcessors(beanFactory); 在所有应用bean创建之前实例化并注册BeanPostProcessor
    1. public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
      		return doGetBean(name, requiredType, null, false);
      	}public static void registerBeanPostProcessors(
      	ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
          // 获取ioc容器已经定义了的需要创建对象的 BeanPostProcessor
      	String[] postProcessorNames = 
              beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
          // 添加其他 BeanPostProcessor
          beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
          // 获取 BeanPostProcessor 对象, 并保存到容器中
          BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
          // 优先注册实现了 PriorityOrdered 接口的 BeanPostProcessor
          sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
          registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
          // 再注册实现了 Ordered 接口的 BeanPostProcessor
          sortPostProcessors(orderedPostProcessors, beanFactory);
          registerBeanPostProcessors(beanFactory, orderedPostProcessors);
          // 然后注册所有常规的 BeanPostProcessor
          registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
      }
      
      public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
          return doGetBean(name, requiredType, null, false);
      }
      
      protected <T> T doGetBean(final String name, 
      	@Nullable final Class<T> requiredType,
          @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
          /**
           * 从缓存中获取根据 BeanPostProcessor 名字获取对应的 BeanPostProcessor, 因为是第一次创
           * 建, 所以 sharedInstance=null
           */
          Object sharedInstance = getSingleton(beanName);
          
          // Create bean instance.
          // 实际在注册获取 BeanPostProcessor 的时候是在创建 BeanPOStProcessor 并保存
          if (mbd.isSingleton()) {
              sharedInstance = getSingleton(beanName, () -> {
                  try {
                      return createBean(beanName, mbd, args);
                  }
                  catch (BeansException ex) {
                      destroySingleton(beanName);
                      throw ex;
                  }
              });
              bean = getObjectForBeanInstance(sharedInstance, name,beanName, mbd);
          }
      }
      
      protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
          // 执行创建
      	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
          return beanInstance;
      }
      
      protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {
      	BeanWrapper instanceWrapper = null;
          // 如果是 singleton 移除(其实就更新, 后面会重新添加到容器)
          if (mbd.isSingleton()) {
              instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
          }
          // 创建 Bean
          if (instanceWrapper == null) {
              instanceWrapper = createBeanInstance(beanName, mbd, args);
          }
          // 包装 bean
          final Object bean = instanceWrapper.getWrappedInstance();
          
          Object exposedObject = bean;
          try {
              // 属性赋值
              populateBean(beanName, mbd, instanceWrapper);
              // 初始化 bean, BeanPostProcessor 是在bean的初始化前后执行
              exposedObject = initializeBean(beanName, exposedObject, mbd);
          }
      }
      
      protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
          /**
           * 判断bean是否为 Aware 接口的实现, 如果是会执行 Aware 接口方法的回调
           */
      	invokeAwareMethods(beanName, bean);
          
          Object wrappedBean = bean;
          if (mbd == null || !mbd.isSynthetic()) {
              // 应用所有后置处理器 postProcessBeforeInitialization()
              wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
          }
          try {
              // 执行自定义的初始化方法
              invokeInitMethods(beanName, wrappedBean, mbd);
          }
          
          if (mbd == null || !mbd.isSynthetic()) {
              // 应用所有后置处理器 postProcessAfterInitialization()
              wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
          }
      }

       

    2. BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator) 创建成功
    3. registerBeanPostProcessors; 将所有BeanPostProcessor添加到BeanFactory中
  4. ================以上是创建和注册 AnnotationAwareAspectJAutoProxyCreator ==================
  5. finishBeanFactoryInitialization(beanFactory); 完成BeanFactory 初始化工作, 创建剩下的单列 bean
    1. if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit())// 满足这些条件的单实例bean

       

      1. preInstantiateSingletons; 遍历获取所有的bean, 依次创建 bean getBean() --> doGetBean() --> getSingleton()
    2. 创建 bean

                   AnnotationAwareAspectJAutoProxyCreator 会在任何 bean 创建之前,AnnotationAwareAspectJAutoProxyCreator 返回 Bean 的代理对象

                   【BeanPostProcessor 是在 bean 创建完, 初始化前后调用】

                    【InstantiationAwareBeanPostProcessor 是在创建 bean 实例对象之前先尝试调用后置处理器返回代理对象】

                     

RootBeanDefinition mbdToUse = mbd; // bean的定义信息
// 希望后置处理器在此能返回一个代理对象, 如果能返回就使用, 不能返回在创建
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        // Make sure bean class is actually resolved at this point.
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            Class<?> targetType = determineTargetType(beanName, mbd);
            if (targetType != null) {
                /**
                 * 获取所有 BeanPostProcessor, 
                  * 如果是 InstantiationAwareBeanPostProcessor
                  * 就执行 postProcessBeforeInstantiation() 
                 */
                bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                if (bean != null) {
                    // 如果后置处理器不为null
                    // 执行所有后置处理器 postProcessAfterInitialization() 
                    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
}

                  Object beanInstance = doCreateBean(beanName, mbdToUse, args); 真正去创建一个 bean 实例, 流程和上面 doCreateBean 一致

  1. AnnotationAwareAspectJAutoProxyCreator 【InstantiationAwareBeanPostProcessor 】作用
    1. 在每个 Bean 创建之前, 调用 postProcessBeforeInstantiation()
      1. 判断当前 bean 是否在 advisedBeans(保存了所有需要增强 bean) 中
        this.advisedBeans.containsKey(cacheKey)

         

      2. 判断当前 bean 是否是基础类型 Advice、Pointcut、Advisor、AopInfrastructureBean 或者是切面(是否使用@Aspect)
        isInfrastructureClass(beanClass)
        protected boolean isInfrastructureClass(Class<?> beanClass) {
            boolean retVal = Advice.class.isAssignableFrom(beanClass) ||
            Pointcut.class.isAssignableFrom(beanClass) ||
            Advisor.class.isAssignableFrom(beanClass) ||
            AopInfrastructureBean.class.isAssignableFrom(beanClass);
            if (retVal && logger.isTraceEnabled()) {
                logger.trace("Did not attempt to auto-proxy infrastructure class [" + beanClass.getName() + "]");
            }
            return retVal;
        }
        protected boolean isInfrastructureClass(Class<?> beanClass) {
            return (super.isInfrastructureClass(beanClass) ||
                (this.aspectJAdvisorFactory != null && 
                 this.aspectJAdvisorFactory.isAspect(beanClass)));
        }
        public boolean isAspect(Class<?> clazz) {
            return (hasAspectAnnotation(clazz) && !compiledByAjc(clazz));
        }

         

      3. 是否需要跳过当前 bean
        shouldSkip(beanClass, beanName)
        protected boolean shouldSkip(Class<?> beanClass, String beanName) {
            // TODO: Consider optimization by caching the list of the aspect names
            // 获取所有候选的增强器(切面里面的通知方法)
            // 包装后 List<Advisor>, 
            // 每一个增强器都是 InstantiationModelAwarePointcutAdvisor
            List<Advisor> candidateAdvisors = findCandidateAdvisors();
            for (Advisor advisor : candidateAdvisors) {
                // 判断是否为 AspectJPointcutAdvisor 类型, 是返回 true
                if (advisor instanceof AspectJPointcutAdvisor &&
                    ((AspectJPointcutAdvisor) 
                     advisor).getAspectName().equals(beanName)) {
                    return true;
                }
            }
            // super.shouldSkip 永远返回false
            return super.shouldSkip(beanClass, beanName);
        }

         

    2. 在每个 Bean 创建之后, 调用 postProcessAfterInitialization()
      // 包装bean 如果需要的情况
      return wrapIfNecessary(bean, beanName, cacheKey);
      
      protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
          if (StringUtils.hasLength(beanName) && 
              this.targetSourcedBeans.contains(beanName)) {
              return bean;
          }
          if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
              return bean;
          }
          if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), 
             beanName)) {
              this.advisedBeans.put(cacheKey, Boolean.FALSE);
              return bean;
          }
          // 获取当前bean 的所有增强器(通知方法), 获取能在当前bean使用的增强器(通知方法)
          // 找到那些方法是需要切入到当前bean方法的
          // 然后给增强器排序
          Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), 
                                          beanName, null);
          if (specificInterceptors != DO_NOT_PROXY) {
              // 保存当前bean 到缓存中
              this.advisedBeans.put(cacheKey, Boolean.TRUE);
              // 创建当前bean代理对象, 如果当前需要增强(如果包含增强器)
              Object proxy = createProxy(
                  bean.getClass(), beanName, specificInterceptors, new 
                  	SingletonTargetSource(bean));
              this.proxyTypes.put(cacheKey, proxy.getClass());
              return proxy;
          }
      
          this.advisedBeans.put(cacheKey, Boolean.FALSE);
          return bean;
      }
      
      protected Object createProxy(Class<?> beanClass, @Nullable String beanName,
      	@Nullable Object[] specificInterceptors, TargetSource targetSource) {
          // 创建代理工厂
          ProxyFactory proxyFactory = new ProxyFactory();
          /// 获取所有增强器
          Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
          // 定制代理工厂
          customizeProxyFactory(proxyFactory);
          // 获取代理对象
          return proxyFactory.getProxy(getProxyClassLoader());
      }
      
      public Object getProxy(@Nullable ClassLoader classLoader) {
          return createAopProxy().getProxy(classLoader);
      }
      // 创建Aop代理
      protected final synchronized AopProxy createAopProxy() {
          if (!this.active) {
              activate();
          }
          return getAopProxyFactory().createAopProxy(this);
      }
      
      // 创建aop 代理; spring自动根据匹配动态创建
      public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
          if (config.isOptimize() || config.isProxyTargetClass() || 
              hasNoUserSuppliedProxyInterfaces(config)) {
              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.");
              }
              if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                  // jdk 动态代理
                  return new JdkDynamicAopProxy(config);
              }
              // cglib 动态代理
              return new ObjenesisCglibAopProxy(config);
          }
          else {
              return new JdkDynamicAopProxy(config);
          }
      }
      // 最终会返回一个 cglib增强的代理对象, 以后容器中获取到的就是这个组件的代理对象, 执行目标方法的时
      // 候, 代理对象就执行通知方法流程
      return wrapIfNecessary(bean, beanName, cacheKey);    

       

    3. 目标方法执行 (容器中保存了组件的代理对象(cglib 增强后的对象), 这个对象里面保存了详细信息(如: 增强器, 目标对象..) )
      1. // 容器返回的为代理对象
        CalculateService bean = context.getBean(CalculateService.class);
        // 执行目标方法
        bean.div(1, 1);

         

      2. 执行目标方法之前会先进入
        CglibAopProxy.intercept()// 拦截目标方法的执行
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy 
        	methodProxy) throws Throwable {
            // 1. 根据 ProxyFactory 获取目标方法的拦截器链
            List<Object> chain =
                this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, 
                targetClass);
            
            // 2. 如果拦截器链为空, 就直接调用目标方法
            if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {
            	Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, 
                                     args);
                retVal = methodProxy.invoke(target, argsToUse);
            } else {
                // 3. 如果有拦截器链, 把需要执行的目标对象, 目标方法, 参数和拦截器链等信息传入创建
                // 一个 CglibMethodInvocation 对象, 并调用
                retVal = new CglibMethodInvocation(proxy, target, method, args, 
                         	targetClass, chain, methodProxy).proceed();
            }
        
        }
        // 2.1 拦截器链获取, 先从缓存中获取, 如果没有会使用 AdvisorChainFactory 根据 
        // ProxyFactory 来获取并缓存
        public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, 
        	@Nullable Class<?> targetClass) {
            MethodCacheKey cacheKey = new MethodCacheKey(method);
            List<Object> cached = this.methodCache.get(cacheKey);
            if (cached == null) {
                cached = 
                  this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(
                  this, method, targetClass);
                this.methodCache.put(cacheKey, cached);
            }
            return cached;
        }
        // 获取连接器链排序后返回
        public List<Object> getInterceptorsAndDynamicInterceptionAdvice(
            Advised config, Method method, @Nullable Class<?> targetClass) {
         	AdvisorAdapterRegistry registry =
                GlobalAdvisorAdapterRegistry.getInstance();
                Advisor[] advisors = config.getAdvisors();
            // 连接器链,里面保存了
            // 一个默认的ExposeInvocationInterceptor, 还有其他所有通知方法
            List<Object> interceptorList = new ArrayList<>(advisors.length);   
            for (Advisor advisor : advisors) {
                // 遍历所有增强器, 包装成 MethodInterceptor 返回
            	MethodInterceptor[] interceptors = registry.getInterceptors(advisor);   
            }
            return interceptorList;
        }
        
        public MethodInterceptor[] getInterceptors(Advisor advisor) throws 
            UnknownAdviceTypeException {
            List<MethodInterceptor> interceptors = new ArrayList<>(3);
            Advice advice = advisor.getAdvice();
            // 如果实现了 MethodInterceptor 直接添加到List中
            if (advice instanceof MethodInterceptor) {
                interceptors.add((MethodInterceptor) advice);
            }
            
            // 如果没有实现MethodInterceptor, 会通过 AdvisorAdapter 进行包装成 
            // AdvisorAdapter
            for (AdvisorAdapter adapter : this.adapters) {
                if (adapter.supportsAdvice(advice)) {
                    interceptors.add(adapter.getInterceptor(advisor));
                }
            }
            if (interceptors.isEmpty()) {
                throw new UnknownAdviceTypeException(advisor.getAdvice());
            }
            return interceptors.toArray(new MethodInterceptor[0]);
        }

         

         

      3. 拦截器链的执行; 连接器链(将通知方法包装成增强器, 然后在执行目标方法的时候再包装成连接器<MethodInterceptor>)

        ① ExposeInvocationInterceptor(ExposeInvocationInterceptor): 默认拦截器

        ② com.yangyun.aop.LogAspect.logThrowing(AspectJAfterThrowingAdvice)

        ③ com.yangyun.aop.LogAspect.logReturning(AspectJAfterReturningAdvice)

        ④ com.yangyun.aop.LogAspect.logEnd(AspectJAfterAdvice)

        ⑤ com.yangyun.aop.LogAspect.logStart(AspectJMethodBeforeAdvice)

        <MethodBeforeAdviceInterceptor>

        // CglibMethodInvocation..proceed(); 循环调用
        public Object proceed() throws Throwable {
            // currentInterceptorIndex 当前连接器链索引,用来记录, 初始值为 -1
        	if (this.currentInterceptorIndex == 
        		this.interceptorsAndDynamicMethodMatchers.size() - 1) {
                return invokeJoinpoint();
            }
            // 如果有List不为空, 每次执行 currentInterceptorIndex 自增 1;
            // 从第一个开始执行 ++this.currentInterceptorIndex = 0;
            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());
                if (dm.methodMatcher.matches(this.method, targetClass, this.arguments)) 
                {
                    return dm.interceptor.invoke(this);
                }
                else {
                    return proceed();
                }
            }
            else {
                // 连接器链调用
                return ((MethodInterceptor) 
                    interceptorOrInterceptionAdvice).invoke(this);
            }
        }
        // 第一个为默认拦截器 ExposeInvocationInterceptor
        // 从共享变量中获取
        private static final ThreadLocal<MethodInvocation> invocation =
            new NamedThreadLocal<>("Current AOP method invocation");
        
        public Object invoke(MethodInvocation mi) throws Throwable {
            MethodInvocation oldInvocation = invocation.get();
            invocation.set(mi);
            try {
                return mi.proceed();
            }
            finally {
                invocation.set(oldInvocation);
            }
        }
        
        // 第二个执行 AspectJAfterThrowingAdvice
        public Object invoke(MethodInvocation mi) throws Throwable {
            try {
                return mi.proceed();
            }
            catch (Throwable ex) {
                if (shouldInvokeOnThrowing(ex)) {
                    invokeAdviceMethod(getJoinPointMatch(), null, ex);
                }
                throw ex;
            }
        }
        
        // 第三个执行 AspectJAfterReturningAdvice
        public Object invoke(MethodInvocation mi) throws Throwable {
            Object retVal = mi.proceed();
            this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), 
            	mi.getThis());
            return retVal;
        }
        
        // 第四个 AspectJAfterAdvice
        public Object invoke(MethodInvocation mi) throws Throwable {
            try {
                return mi.proceed();
            }
            finally {
                invokeAdviceMethod(getJoinPointMatch(), null, null);
            }
        }
        
        // 第五个 AspectJMethodBeforeAdvice --> MethodBeforeAdviceInterceptor
        public Object invoke(MethodInvocation mi) throws Throwable {
            this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis());
            return mi.proceed();
        }
        
        // 所有拦截器执行完 currentInterceptorIndex = 4
        if (this.currentInterceptorIndex == 
            this.interceptorsAndDynamicMethodMatchers.size() - 1) {
            // 执行该方法
            return invokeJoinpoint();
        }
        
        protected Object invokeJoinpoint() throws Throwable {
            if (this.methodProxy != null) {
                return this.methodProxy.invoke(this.target, this.arguments);
            }
            else {
                return super.invokeJoinpoint();
            }
        }

         

小总结

  1. @EnableAspectJAutoProxy 开启AOP 功能
  2. @EnableAspectJAutoProxy 会给容器注册组件 AnnotationAwareAspectJAutoProxyCreator 后置处理器
  3. 容器创建
    1. registerBeanPostProcessors()注册后置处理器;创建AnnotationAwareAspectJAutoProxyCreator对象
    2. finishBeanFactoryInitialization()初始化剩下的单实例bean
      1. 创建业务逻辑组件和切面组件
      2. AnnotationAwareAspectJAutoProxyCreator 拦截组件的创建
      3. 组件创建完成之后, 判断组件是否需要增强(针对通知方法), 将通知方法包装成增强器(Advisor), 给业务组件创建一个代理对象(cglib)
    3. 执行目标方法
      1. 容器获取代理对象并执行目标方法
      2. CglibAopProxy.intercept()
        1. 得到目标方法连接器链(增强器包装成MetodInterceptor)
        2. 利用连接器的链式机制, 依次执行拦截器
        3. 效果
          1. 正常执行:前置通知--》目标方法--》后置通知--》返回通知
          2. 出现异常:前置通知--》目标方法--》后置通知--》异常通知

学无止境, 永不止步!

更多精彩: https://github.com/SamsaraCloud/study.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值