org.springframework.aop.config.ConfigBeanDefinitionParser#parse

8 篇文章 0 订阅

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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值