1、利用注解@EnableAspectJAutoProxy开启AOP功能。
2、注解@EnableAspectJAutoProxy会给容器注册一个组件AnnotationAwareAspectJAutoProxyCreator
3、AnnotationAwareAspectJAutoProxyCreator是一个后置处理器
4、利用容器创建的流程:
1)、通过registerBeanPostProcessors(beanFactory);注册后置处理器,创建AnnotationAwareAspectJAutoProxyCreator
2)、通过finishBeanFactoryInitialization(beanFactory);创建剩下的单实例bean
1)、创建业务逻辑类和切面类组件
2)、AnnotationAwareAspectJAutoProxyCreator会拦截上述组件的创建过程
3)、也就是在组件创建完之后,会判断组件是否需要增强
是:会将切面类的通知方法包装成增强器(Advisor),然后给业务逻辑组件创建一个动态代理对象(cglib动态代理对象)
5、执行目标方法
1)、代理对象执行目标方法
2)、通过CglibAopProxy.intercept()来拦截
1)、获取目标方法的拦截器链(也就是将增强器包装成的MethodInterceptor拦截器)
2)、利用拦截器的链式机制,依次进入每一个拦截器进行执行。如下图:
3)、执行效果:
正常执行:前置通知->目标方法->后置通知->返回通知
异常执行:前置通知->目标方法->后置通知->异常通知