Spring AOP
2021-06-19 14:23:32 46 举报
Spring AOP源码脉络分析
作者其他创作
大纲/内容
if (this.advisorFactory.isAspect(beanType))
开启切面
AnnotationAwareAspectJAutoProxyCreator
标注
排序(增强器)Expose - throwing - returning - after - before
Bean初始化完成后,调用Bean后置处理器的 AfterInitialization方法
注册bean定义
if (this.beanFactory.isSingleton(beanName))
AbstractAutoProxyCreator(抽象类)
不跳过为bean实例创建一个目标源。如果设置,使用任何TargetSourceCreators(this.customTargetSourceCreators属性不为空)
遍历结束
③ 生成增强器
遍历每个aspectName首先,尝试直接从 advisorsCache中获取,如果获取不到,则从 aspectFactoryCache 获取工厂对象,生成
true1、获取到容器中所有对象的beanNames集合(非常耗时)2、遍历每个beanName3、获取beanName对应类对象
......
extendAdvisors(eligibleAdvisors)
findCandidateAdvisors()
查询缓存
false
super.findCandidateAdvisors()
List<String> aspectNames =this.aspectBeanNames
refresh()
InstantiationAwareBeanPostProcessor
sortAdvisors(eligibleAdvisors)
如果当前类被 @Aspect注解了,执行后续操作① 收集beanName
实例化的前置处理
忽略
wrapIfNecessary( ... )
postProcessBeforeInstantiation( ... )
暂不分析原因:当前流程是填充缓存
aspectNames.add(beanName)
this.aspectBeanNames = aspectNames
AbstractAdvisorAutoProxyCreator
如果目标源不为空,则创建、返回代理对象(默认返回 null)
注册 bean后置处理器
Object proxy = createProxy( ... )
④ 加入缓存
resolveBeforeInstantiation( ... )
SmartInstantiationAwareBeanPostProcessor
false缓存工厂
AbstractAutoProxyCreator
Object[] specificInterceptors =getAdvicesAndAdvisorsForBean( ... )
容器中查找注解了@aspectj的bean(重点)
initializeBean( ... )
true
AbstractAutoProxyCreator.postProcessAfterInitialization( ... )
@Import(AspectJAutoProxyRegistrar.class)
processor.postProcessAfterInitialization( ... )
registerBeanPostProcessors(beanFactory)
从所有的候选增强器中,找到可以应用到当前bean的增强器
List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply( ... )
this.aspectJAdvisorsBuilder.buildAspectJAdvisors()
this.advisorRetrievalHelper.findAdvisorBeans()
return proxy;
AspectJAwareAdvisorAutoProxyCreator
return bean;
BeanPostProcessor
true单例对象,直接缓存其增强器集合
阶段三:实例化bean
.......
this.beanPostProcessors.add(beanPostProcessor)
if (specificInterceptors != DO_NOT_PROXY)
容器中查找 Advisor类型(事务)
实现
if (aspectNames == null)
遍历 beanPostProcessors集合,筛选 InstantiationAwareBeanPostProcessor类型的Bean后置处理器
可应用增强器集合不为空的情况下,追加一个 ExposeInvocationInterceptor 到集合的首位
② 构建工厂对象
类继承图
AbstractAutowireCapableBeanFactory.createBean( ... )
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)
List<Advisor> classAdvisors =this.advisorFactory.getAdvisors(factory)
不做分析
@EnableAspectJAutoProxy
如果当前BeanName 需要被增强
这时实例类是 AnnotationAwareAspectJAutoProxyCreator重写了 shouldSkip方法
Object proxy = createProxy( ... )
获取容器中所有的bean后置处理器集合遍历每个processor
findEligibleAdvisors( ... )
让BeanPostProcessors有机会返回代理,而不是目标bean实例解析切面
doCreateBean( ... )
阶段二:注册后置处理器
阶段一:配置解析
registry.registerBeanDefinition( ... )
0 条评论
下一页