一.AOP是什么?
二.AOP有什么用?
三.AOP怎么实现?(本节主要讨论)
AOP的核心点牢记: 切点(pointCut) + 增强 (adviser)
会简单使用AOP之后的一些思考:
- 什么时候创建AOP切面?
- 怎么进入到AOP切面调用?
- AOP的增强adviser什么时候加载?
- advisers怎么确定的顺序?
- 被代理的方法,增强链式怎么进行调用?
1.什么时候创建AOP切面?--- 在Bean初始化的时候创建的AOP切面(AOP切面就是一个创建一个代理类proxy)
@1.....
getBean()
.....
@2.....
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
.....
@3.....
//依赖注入操作
populateBean(beanName, mbd, instanceWrapper);
// 执行 beanPostprocess (各类增强,包括AOP代理) 中方法的操作
exposedObject = initializeBean(beanName, exposedObject, mbd);
.....
@4.....
//循环 调用所有加载的beanPostProcessors
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
.....
@5.....
return wrapIfNecessary(bean, beanName, cacheKey);
.....
@6.....
// Create proxy if we have advice.
//如果存在advice增强 , 也就是这个bean被 AspectJ 中的pointCut扫描到了,并且这个 AspectJ 存在增强方法
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
.....
2.进入AOP切面调用? --- JDK 的动态代理-invoke调用
3.AOP的增强adviser什么时候加载? ---- @EnableAspectJAutoProxy --> AspectJAutoProxyRegistrar.class ---> AnnotationAwareAspectJAutoProxyCreator.class 该类被spring管理,在Bean初始化过程中,执行advisor 的扫描,整理,排序
4.advisers怎么确定的顺序?Order接口+ Comparator
5.图解aop链式调用过程