public BeanDefinition parse(Element element, ParserContext parserContext) {
1、 CompositeComponentDefinition compositeDef =
new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
2、 parserContext.pushContainingComponent(compositeDef);
3、 configureAutoProxyCreator(parserContext, element);
List<Element> childElts = DomUtils.getChildElements(element);
for (Element elt: childElts) {
String localName = parserContext.getDelegate().getLocalName(elt);
if (POINTCUT.equals(localName)) {
parsePointcut(elt, parserContext);
}
else if (ADVISOR.equals(localName)) {
parseAdvisor(elt, parserContext);
}
else if (ASPECT.equals(localName)) {
parseAspect(elt, parserContext);
}
}
parserContext.popAndRegisterContainingComponent();
return null;
}
org.springframework.aop.config.ConfigBeanDefinitionParser
org.springframework.beans.factory.xml.ParserContext
符合组件
org.springframework.beans.factory.parsing.ComponentDefinition
org.springframework.beans.factory.xml.ParserContext#containingComponents 内存缓存储存
org.springframework.beans.factory.xml.ParserContext#pushContainingComponent 写入
org.springframework.beans.factory.xml.ParserContext#getContainingComponent 读取
org.springframework.beans.factory.xml.ParserContext#registerComponent 大概是创建关系 待深究
org.springframework.beans.factory.parsing.CompositeComponentDefinition#nestedComponents 最终数据介质
最终注册到容器上
org.springframework.aop.config.ConfigBeanDefinitionParser#parseAdvice
org.springframework.beans.factory.xml.XmlReaderContext#registerWithGeneratedName
org.springframework.beans.factory.support.BeanDefinitionRegistry#registerBeanDefinition
复合组件 (根接口 org.springframework.beans.BeanMetadataElement)
org.springframework.beans.factory.parsing.CompositeComponentDefinition
第三步
注册 代理创建者
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator xml接入
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator 注解接入
到容器中 parserContext-readerContext-reader-registry(GenericApplicationContext)-beanFactory(DefaultListableBeanFactory)–beanDefinitionMap
一、完成代理创建者的注册
org.springframework.aop.config.AopNamespaceUtils#registerAspectJAutoProxyCreatorIfNecessary
入参 1、AliasRegistry的子类
org.springframework.aop.config.AopConfigUtils#registerAspectJAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)
org.springframework.aop.config.AopConfigUtils#registerOrEscalateApcAsRequired
一个特殊的类的关键字名 (内部管理的自动代理创建者的Bean名称)
public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
“org.springframework.aop.config.internalAutoProxyCreator”;
1、识别是否已经加载创建者的类
如果有
识别类名是否与传入的类一致
不一致 不做任何处理
一致 Priority值 已注册的小则覆盖类名 大则什么都不处理
没有注册过
实例化RootBeanDefinition并注册到容器
二、必要时强制处理一部分动作
org.springframework.aop.config.AopNamespaceUtils#useClassProxyingIfNecessary
public static final String PROXY_TARGET_CLASS_ATTRIBUTE = "proxy-target-class";
private static final String EXPOSE_PROXY_ATTRIBUTE = "expose-proxy";
1、 xml资源数据非空 否则不做任何处理
2、xml里配置了proxy-target-class
触发 org.springframework.aop.config.AopConfigUtils#forceAutoProxyCreatorToUseClassProxying
3、xml里配置了expose-proxy
触发org.springframework.aop.config.AopConfigUtils#forceAutoProxyCreatorToExposeProxy
三、没搞懂实际作用
org.springframework.aop.config.AopNamespaceUtils#registerComponentIfNecessary
1、第一阶段注册后没有返回对象则不做任何操作 (首次注册必不为空)
2、加到集合 org.springframework.beans.factory.parsing.CompositeComponentDefinition#nestedComponents中