AOP
AOP 原理
- @EnableAspectJAutoProxy
-
@Import(AspectJAutoProxyRegistrar.class) 给容器导入AspectJAutoProxyRegistrar;
-
利用AspectJAutoProxyRegistrar 给容器中注册
internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
-
- AnnotationAwareAspectJAutoProxyCreator

AOP 流程
-
创建IOC容器
-
注册配置类,refresh() 刷新容器
-
registerBeanPostProcessors() 注册拦截bean创建的bean后置处理器
-
获取IOC容器中已经定义的需要创建的Bean后置处理器
-
容器中添加别的后置处理器
-
优先注册实现PriorityOrdered接口的后置处理器
-
再注册实现Ordered接口的后置处理器
-
注册没有实现优先级接口的后置处理器
-
注册BeanPostProcessors,
创建internalAutoProxyCreator的BeanPostProcessors[AnnotationAwareAspectJAutoProxyCreator ]- 创建Bean的实例
- populateBean:给各种bean的属性赋值
- initializeBean:初始化Bean
- invokeAwareMethods: aware接口的方法处理
- applyBeanPostProcessorsBeforeInitialization:后置处理器的调用BeforeInitialization
- invokeInitMethods:自定义初始化方法
- applyBeanPostProcessorsAfterInitialization:后置处理器的调用AfterInitialization
- BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)创建成功;----- aspectJAdvisorsBuilder
-
把BeanPostProcessor注册到BeanFactory中; beanFactory.addBeanPostProcessor(postProcessor);
-
-
finishBeanFactoryInitialization(beanFactory):创建剩余的单实例Bean
-
遍历获取容器中所有的Bean,依次创建对象getBean(beanName);
getBean->doGetBean()->getSingleton()->
-
创建Bean:先从缓存中获取
-
createBean:resolveBeforeInstantiation(beanName, mbdToUse);解析BeforeInstantiation
后置处理器返回代理对象;
【BeanPostProcessor是在Bean对象创建完成初始化前后调用的】 【InstantiationAwareBeanPostProcessor是在创建Bean实例之前先尝试用后置处理器返回对象的】
-
doCreateBean(beanName, mbdToUse, args):真正的去创建一个bean实例
Object bean = null; // ..... bean = applyBeanPostProcessorsBeforeInstantiation() // 拿到所有后置处理器,如果是InstantiationAwareBeanPostProcessor; // 就执行postProcessBeforeInstantiation if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); }
-
-
AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】 的作用
-
每一个bean创建之前,调用postProcessBeforeInstantiation()
-
判断当前bean是否在advisedBeans中(保存了所有需要增强bean)
-
判断当前bean是否是基础类型的Advice、Pointcut、Advisor、AopInfrastructureBean,或者是否是切面(@Aspect)
-
是否需要跳过:永远返回false;
-
-
创建对象postProcessAfterInitialization:wrapIfNecessary(bean, beanName, cacheKey)
-
获取当前bean的所有增强器(通知方法)
-
保存当前bean在advisedBeans中
-
如果当前bean需要增强,创建当前bean的代理对象
-
给容器中返回当前组件使用cglib增强了的代理对象;
-
以后容器中获取到的就是这个组件的代理对象,执行目标方法的时候,代理对象就会执行通知方法的流程
-
-
目标方法执行: 容器中保存了组件的代理对象(cglib增强后的对象),这个对象里面保存了详细信息(比如增强器,目标对象,xxx)
- CglibAopProxy.intercept():拦截目标方法的执行
- 根据ProxyFactory对象获取将要执行的目标方法拦截器链
- 保存所有拦截器 1个默认的ExposeInvocationInterceptor 和 4个增强器;
- 遍历所有的增强器,将其转为Interceptor
- 如果没有拦截器链,直接执行目标方法
- 如果有拦截器链,把需要执行的目标对象,目标方法,拦截器链等信息传入创建一个 CglibMethodInvocation 对象,并调用 proceed();
- 拦截器链的触发过程
- 如果没有拦截器执行执行目标方法,或者拦截器的索引和拦截器数组-1大小一样(指定到了最后一个拦截器)执行目标方法
- 链式获取每一个拦截器,拦截器执行invoke方法,每一个拦截器等待下一个拦截器执行完成返回以后再来执行;
- 拦截器链的机制,保证通知方法与目标方法的执行顺序;
-
