Spring的XML解析原理,这一次全搞懂再走( 六 )
public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder definition, ParserContext parserContext) {if (node instanceof Attr) {Attr attr = (Attr) node;String argName = StringUtils.trimWhitespace(parserContext.getDelegate().getLocalName(attr));String argValue = http://kandian.youth.cn/index/StringUtils.trimWhitespace(attr.getValue());ConstructorArgumentValues cvs = definition.getBeanDefinition().getConstructorArgumentValues();boolean ref = false;// handle -ref argumentsif (argName.endsWith(REF_SUFFIX)) {ref = true;argName = argName.substring(0, argName.length() - REF_SUFFIX.length());}ValueHolder valueHolder = new ValueHolder(ref ? new RuntimeBeanReference(argValue) : argValue);valueHolder.setSource(parserContext.getReaderContext().extractSource(attr));// handle"escaped"/"_" argumentsif (argName.startsWith(DELIMITER_PREFIX)) {String arg = argName.substring(1).trim();// fast default checkif (!StringUtils.hasText(arg)) {cvs.addGenericArgumentValue(valueHolder);}// assume an index otherwiseelse {int index = -1;try {index = Integer.parseInt(arg);}catch (NumberFormatException ex) {parserContext.getReaderContext().error("Constructor argument '" + argName + "' specifies an invalid integer", attr);}if (index < 0) {parserContext.getReaderContext().error("Constructor argument '" + argName + "' specifies a negative index", attr);}if (cvs.hasIndexedArgumentValue(index)) {parserContext.getReaderContext().error("Constructor argument '" + argName + "' with index "+ index+" already defined using
很简单 , 拿到c标签对应的值 , 封装成ValueHolder , 再添加到BeanDefinition的ConstructorArgumentValues属性中去 , 这样就装饰完成了 。 讲到这里你可能会觉得 , 这和平时看到装饰器模式不太一样 。 其实 , 设计模式真正想要表达的是各种模式所代表的思想 , 而不是死搬硬套的实现 , 只有灵活的运用其思想才算是真正的掌握了设计模式 , 而装饰器模式的精髓就是动态的将属性、功能、责任附加到对象上 , 这样你再看这里是否是运用了装饰器的思想呢?装饰完成后返回BeanDefinitionHolder对象并调用BeanDefinitionReaderUtils.registerBeanDefinition方法将该对象缓存起来 , 等待容器去实例化 。 这里就是将其缓存到DefaultListableBeanFactory的beanDefinitionMap属性中 , 自己看看代码也就明白了 , 我就不贴代码了 。 至此 , Spring的XML解析原理分析完毕 , 下面是我画的时序图 , 可以对照看看:
文章插图
总结本篇是Spring源码分析的第一篇 , 只是分析了refresh中的obtainFreshBeanFactory方法 , 我们可以看到仅仅是对XML的解析和bean定义的注册缓存 , Spring就做了这么多事 , 并考虑到了各个可能会扩展的地方 , 那我们平时做的项目呢?看似简单的背后是否有深入思考过呢?
作者: 夜勿语
【Spring的XML解析原理,这一次全搞懂再走】原文链接:
- 小米科技|性价比拉满!TCL T8E-PRO QLED智屏当属潮玩世代的必备单品
- 华为鸿蒙系统|华为汽车战略布局,进入汽车行业的底气来自哪里?(车车佳)
- 浙江省|浙江的五大富豪,四位做过中国首富,仅马云的阿里就1年纳税366亿
- iOS|恒创科技:Linux日本云服务器安全设置的基本步骤
- javascript|手机移动端的PyTorch来了,还支持JavaScript
- 中关村|柳传志在这里被骗、掘金,书写半部科技史的中关村经历了什么?
- 手机维修|手机维修的猫腻‖你是不是上当了?
- 智能化|感知局限下,车路协同的“子弹”还得再飞会儿
- 华为鸿蒙系统|都2021年底了,为何Mate40Pro还是目前公认最好用的“安卓”手机
- saas|上半年的Redmi K40 Pro,现在入手2500元不到,还等?