总结:
1、利用@EnableAspectJAutoProxy注解开启AOP功能;@EnableAspectJAutoProxy利用AspectJAutoProxyRegistrar.class给容器中注册一个组件:AnnotationAwareAspectJAutoProxyCreator;(保存组件的BeanDefinition信息)
他是一个后置处理器;
2:将AnnotationAwareAspectJAutoProxyCreator注册到BeanFactory,创建AnnotationAwareAspectJAutoProxyCreator对象;是通过调用registerBeanPostProcessors(beanFactory)实现的;它属于创建AnnotationConfigApplicationContext过程中调用的refesh();
AnnotationAwareAspectJAutoProxyCreator:该组件是一个后置处理器,它实现了
BeanPostProcessor接口、BeanFactoryAware接口;
3:初始化剩下的单实例Bean(例如演示代码中的MathCalculetor等);refresh()的另一个重要方法:finishBeanFactoryInitialization(beanFactory);组件创建完成,并为其创建代理对象;
3.1)、创建业务逻辑组件、切面组件(MathCalculator、LogAspects);
3.2)、后置处理器AnnotationAwareAspectJAutoProxyCreator会拦截以上两组件的创建过程;
3.3)、组件创建完成,并为其创建代理对象,容器中拿到的组件就是代理对象(cglib增强后的对象),在执行方法时就由代理对象代理执行;
3.3.1)判断组件是否需要增强(wrapIfNecessary()),若是,就把切面的通知方法包装成增强器(Advisor),给业务逻辑组件创建一个代理对象;
4:组件的代理对象创建完成后,执行目标方法:
4.1)、代理对象执行目标方法:CglibAopProxy.intercept();
拦截过程:
4.1.1)、得到目标方法的拦截器链(增强器包装成拦截器:MethodInterceptor);
4.1.2)、利用拦截器的链式机制,依次进入每一个拦截器执行;
4.1.3)、执行过程:
若目标方法正常执行:先执行前置通知--》目标方法--》后置通知--》返回通知;
若目标方法执行异常:先执行前置通知--》目标方法--》后置通知--》异常通知;
至此,AOP源码解读结束。