1)@EnableAspectJAutoProxy 开启AOP功能
@EnableAspectJAutoProxy上@Import(AspectJAutoProxyRegistrar.class)
AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar,实现registerBeanDefinitions方法
自定义给容器中注册bean:【internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator】
2)容器的创建流程
refresh()函数有个registerBeanPostProcessors方法, 它创建和注册AnnotationAwareAspectJAutoProxyCreator,这是个后置处理器,以方便后续拦截bean的创建 refresh()函数中finishBeanFactoryInitialization创建剩下的单实例。单实例缓存没有就创建, resolveBeforeInstantiation,希望后置处理器在此能返回一个代理对象; 如果能返回代理对象就使用,如果不能就doCreateBean resolveBeforeInstantiation拿到所有后置处理器,如果实现InstantiationAwareBeanPostProcessor 就执行postProcessBeforeInstantiation和postProcessAfterInstantiation拦截方法, 而AnnotationAwareAspectJAutoProxyCreator就实现此接口,拦截方法中创建bean的代理对象给容器
3)执行目标方法
代理对象中的peoxyFactory包含增强器,目标对象,
目标方法执行,CglibAopProxy.intercept();遍历所有的增强器,将其转为Interceptor,利用MethodInterceptor机制生成拦截器链,
如果有拦截器链,把需要执行的目标对象,目标方法,拦截器链等信息传入创建一个 CglibMethodInvocation 对象,
调用mi.proceed(),链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等待下一个拦截器执行完成返回以后再来执行;
拦截器链的机制,保证通知方法与目标方法的执行顺序