AOP源码分析
2021-06-24 16:20:30 13 举报
AOP
作者其他创作
大纲/内容
这里解释了,为什么如果代理对象是一个接口,则会是JDk动态代理
AnnotationAwareAspectJAutoProxyCreator
找到所有实现了Advisor接口的对象,如果没有创建一个空集合
aspectJAdvisorsBuilder.buildAspectJAdvisors()
JdkDynamicAopProxy.getProxy
shouldSkip
postProcessAfterInitialization
找到所有的@Aspect修饰的Bean,并以AspectBean的Name为key,Advisor的数组为value,缓存所有的Advisor增强器
DefaultAopProxyFactory.createAopProxy
AspectJAwareAdvisorAutoProxyCreator
调用findCandidateAdvisors
至此代理对象就创建完毕了
AbstractAutoProxyCreator
把之前获取的对象都转换成真正的Advisor对象
@EnableAspectJAutoProxy
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)
createProxy
buildAdvisors
创建AOP代理对象
AbstractAdvisorAutoProxyCreator拿到所有要使用的增强器Advisor
执行代理对象
advisedBeans.containsKey(cacheKey)
按照这个顺序TimSort排好序
proxyFactory.getProxy
调用bean的初始化
按链调用Advisor
调用bean的实例化
其父类AbstractAutoProxyCreator
如果是Adviesed对象,则不需要进行代理
获取拦截器链
AspectJAutoProxyRegistrar
postProcessBeforeInstantiation
getAdvicesAndAdvisorsForBean
加载AOP能力
向IOC容器中注册代理对象工厂AnnotationAwareAspectJAutoProxyCreator的BeanDefinition
wrapIfNecessary
因为Creator是一个BeanPostProceesor,我们应该猜测,其应该插入在哪个生命周期处,大概率是在初始化结束后,生成代理对象。然后替换单例注册表中的原对象为代理对象,达到AOP的目的。
JdkDynamicAopProxy.invoke
0 条评论
下一页