当前位置: 首页 > news >正文

大连装修公司哪家比较好网站快速排名优化报价

大连装修公司哪家比较好,网站快速排名优化报价,电话卡代理平台,做流量的网站应该注意什么前面几章的内容已经介绍了BeanFactory创建前的准备工作,以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述,着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…

前面几章的内容已经介绍了BeanFactory创建前的准备工作,以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。

registerBeanDefinitions

前几个方法不做过多的赘述,着重看registerBeanDefinitions方法中解析XML的步骤。

	public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {// 对xml的beanDefinition进行解析BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();int countBefore = getRegistry().getBeanDefinitionCount();// 完成具体的解析过程documentReader.registerBeanDefinitions(doc, createReaderContext(resource));return getRegistry().getBeanDefinitionCount() - countBefore;}

doRegisterBeanDefinitions

之前已经将XML转换成了Document对象,所以Element 元素就是XML配置文件中的最外层标签< beans >,并且看beans标签中是否配置了default-lazy-init,default-merge等属性,如果配置了则进行赋值。其中defaultNamespace就是XML配置文件中beans标签的xmlns属性中所对应的。主要是用来在网上对应地址进行校验XML。
在这里插入图片描述

protected void doRegisterBeanDefinitions(Element root) {// Any nested <beans> elements will cause recursion in this method. In// order to propagate and preserve <beans> default-* attributes correctly,// keep track of the current (parent) delegate, which may be null. Create// the new (child) delegate with a reference to the parent for fallback purposes,// then ultimately reset this.delegate back to its original (parent) reference.// this behavior emulates a stack of delegates without actually necessitating one.BeanDefinitionParserDelegate parent = this.delegate;//创建Delegate,并且看beans标签中是否配置了default-lazy-init,default-merge等属性,设置默认值this.delegate = createDelegate(getReaderContext(), root, parent);//defaultNamespace = http://www.springframework.org/schema/beansif (this.delegate.isDefaultNamespace(root)) {String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);if (StringUtils.hasText(profileSpec)) {String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);// We cannot use Profiles.of(...) since profile expressions are not supported// in XML config. See SPR-12458 for details.if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {return;}}}preProcessXml(root);parseBeanDefinitions(root, this.delegate);postProcessXml(root);this.delegate = parent;}

parseBeanDefinitions
解析XML的具体操作,从beans标签节点开始逐层像里面遍历

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace(root)) {//获取childNodeNodeList nl = root.getChildNodes();for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);if (node instanceof Element) {Element ele = (Element) node;if (delegate.isDefaultNamespace(ele)) {parseDefaultElement(ele, delegate);}else {delegate.parseCustomElement(ele);}}}}else {delegate.parseCustomElement(root);}}

parseDefaultElement

默认namespace,则走parseDefaultElement方法进行解析,只有Spring默认的标签,才会执行这个解析方式,默认标签共有import、alias、bean和beans四种。

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {importBeanDefinitionResource(ele);}else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {processAliasRegistration(ele);}else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {processBeanDefinition(ele, delegate);}else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {// recursedoRegisterBeanDefinitions(ele);}}

processBeanDefinition

每种对应的解析方式也不同,以bean标签为例。创建一个BeanDefinitionHolder 对象用来封装

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {// beanDefinitionHolder是beanDefinition对象的封装类,封装了BeanDefinition,bean的名字和别名,用它来完成向IOC容器的注册// 得到这个beanDefinitionHolder就意味着beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行// 解析得到的BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);if (bdHolder != null) {bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.// 向ioc容器注册解析得到的beandefinition的地方BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {}// Send registration event.// 在beandefinition向ioc容器注册完成之后,发送消息getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}}

解析bean标签

获取bean标签中id属性和name属性,并检查唯一性,调用parseBeanDefinitionElement进一步解析bean下其他节点属性。
parseBeanDefinitionElement

	@Nullablepublic BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {// 解析id属性String id = ele.getAttribute(ID_ATTRIBUTE);// 解析name属性String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);// 如果bean有别名的话,那么将别名分割解析List<String> aliases = new ArrayList<>();if (StringUtils.hasLength(nameAttr)) {String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);aliases.addAll(Arrays.asList(nameArr));}String beanName = id;if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {beanName = aliases.remove(0);}if (containingBean == null) {checkNameUniqueness(beanName, aliases, ele);}// 对bean元素的详细解析AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);if (beanDefinition != null) {if (!StringUtils.hasText(beanName)) {try {// 如果不存在beanname,那么根据spring中提供的命名规则为当前bean生成对应的beanNameif (containingBean != null) {beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, this.readerContext.getRegistry(), true);}else {beanName = this.readerContext.generateBeanName(beanDefinition);// Register an alias for the plain bean class name, if still possible,// if the generator returned the class name plus a suffix.// This is expected for Spring 1.2/2.0 backwards compatibility.String beanClassName = beanDefinition.getBeanClassName();if (beanClassName != null &&beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&!this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {aliases.add(beanClassName);}}}catch (Exception ex) {error(ex.getMessage(), ele);return null;}}String[] aliasesArray = StringUtils.toStringArray(aliases);return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);}return null;}

parseBeanDefinitionElement
createBeanDefinition中创建的是GenericBeanDefinition,将解析好的属性值放到GenericBeanDefinition中,并封装到BeanDefinitionHolder中。

public AbstractBeanDefinition parseBeanDefinitionElement(Element ele, String beanName, @Nullable BeanDefinition containingBean) {this.parseState.push(new BeanEntry(beanName));// 解析class属性String className = null;if (ele.hasAttribute(CLASS_ATTRIBUTE)) {className = ele.getAttribute(CLASS_ATTRIBUTE).trim();}// 解析parent属性String parent = null;if (ele.hasAttribute(PARENT_ATTRIBUTE)) {parent = ele.getAttribute(PARENT_ATTRIBUTE);}try {// 创建装在bean信息的AbstractBeanDefinition对象,实际的实现是GenericBeanDefinitionAbstractBeanDefinition bd = createBeanDefinition(className, parent);// 解析bean标签的各种其他属性parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);// 设置description信息bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));// 解析元数据parseMetaElements(ele, bd);// 解析lookup-method属性parseLookupOverrideSubElements(ele, bd.getMethodOverrides());// 解析replaced-method属性parseReplacedMethodSubElements(ele, bd.getMethodOverrides());// 解析构造函数参数parseConstructorArgElements(ele, bd);// 解析property子元素parsePropertyElements(ele, bd);// 解析qualifier子元素parseQualifierElements(ele, bd);bd.setResource(this.readerContext.getResource());bd.setSource(extractSource(ele));return bd;} finally {this.parseState.pop();}return null;}

此时,整个bean标签已经全部加载完成,并封装到了一个BeanDefinitionHolder中,接下来,再回到BeanDefinitionHolder的操作。看解析完之后做了些什么。parseBeanDefinitionElement方法已经执行完,接下来是registerBeanDefinition。

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {// beanDefinitionHolder是beanDefinition对象的封装类,封装了BeanDefinition,bean的名字和别名,用它来完成向IOC容器的注册// 得到这个beanDefinitionHolder就意味着beandefinition是通过BeanDefinitionParserDelegate对xml元素的信息按照spring的bean规则进行// 解析得到的BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);if (bdHolder != null) {bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.// 向ioc容器注册解析得到的beandefinition的地方BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {getReaderContext().error("Failed to register bean definition with name '" +bdHolder.getBeanName() + "'", ele, ex);}// Send registration event.// 在beandefinition向ioc容器注册完成之后,发送消息getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}}

registerBeanDefinition
这个方法主要流程是获取封装进eanDefinitionHolder的beanName,注册到BeanFactory容器中。

public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// Register bean definition under primary name.// 使用beanName做唯一标识注册String beanName = definitionHolder.getBeanName();registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());// Register aliases for bean name, if any.// 注册所有的别名String[] aliases = definitionHolder.getAliases();if (aliases != null) {for (String alias : aliases) {registry.registerAlias(beanName, alias);}}}

registerBeanDefinition
beanDefinitionMap:ConcurrentHashMap<String, BeanDefinition> beanDefinitionMap类型(key:beanName,value:BeanDefinition)。
beanDefinitionNames:ArrayList< String > beanDefinitionNames类型。
如果beanDefinitionMap中key存在,证明加载解析过,则看allowBeanDefinitionOverriding是否允许类被覆盖(创建BeanFactory是设置的值),可以则覆盖,不可以则抛异常。
如果没加载过,则放到beanDefinitionMap和beanDefinitionNames中。

@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {if (beanDefinition instanceof AbstractBeanDefinition) {try {// 注册前的最后一个校验,这里的检验不同于之前的xml文件校验,主要是对应abstractBeanDefinition属性的methodOverrides校验,// 检验methodOverrides是否与工厂方法并存或者methodoverrides对应的方法根本不存在((AbstractBeanDefinition) beanDefinition).validate();}//异常,省略。。}BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);// 处理注册已经注册的beanName情况if (existingDefinition != null) {// 如果对应的beanName已经注册且在配置中配置了bean不允许被覆盖,则抛出异常if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);}//LOG,省略。。this.beanDefinitionMap.put(beanName, beanDefinition);}else {if (hasBeanCreationStarted()) {// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap) {this.beanDefinitionMap.put(beanName, beanDefinition);List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;removeManualSingletonName(beanName);}}else {// Still in startup registration phase// 注册beanDefinitionthis.beanDefinitionMap.put(beanName, beanDefinition);// 记录beanNamethis.beanDefinitionNames.add(beanName);removeManualSingletonName(beanName);}this.frozenBeanDefinitionNames = null;}if (existingDefinition != null || containsSingleton(beanName)) {// 重置所有beanName对应的缓存resetBeanDefinition(beanName);}else if (isConfigurationFrozen()) {clearByTypeCache();}}

至此,XML加载整个bean标签流程结束。
在这里插入图片描述


文章转载自:
http://wanjiaabrasion.Lbqt.cn
http://wanjiaparylene.Lbqt.cn
http://wanjiaflagrance.Lbqt.cn
http://wanjiaminifestival.Lbqt.cn
http://wanjiathirstily.Lbqt.cn
http://wanjiajames.Lbqt.cn
http://wanjiabloomy.Lbqt.cn
http://wanjiagurge.Lbqt.cn
http://wanjiaspherics.Lbqt.cn
http://wanjiawestering.Lbqt.cn
http://wanjiaunfilterable.Lbqt.cn
http://wanjiastenography.Lbqt.cn
http://wanjiahydrarthrosis.Lbqt.cn
http://wanjiasequela.Lbqt.cn
http://wanjiascreenwasher.Lbqt.cn
http://wanjialag.Lbqt.cn
http://wanjiapalaeomagnetism.Lbqt.cn
http://wanjiaarrowhead.Lbqt.cn
http://wanjiacheval.Lbqt.cn
http://wanjiafissionable.Lbqt.cn
http://wanjiaduomo.Lbqt.cn
http://wanjiaskillfully.Lbqt.cn
http://wanjiapulverulent.Lbqt.cn
http://wanjiawaveoff.Lbqt.cn
http://wanjiaetiquette.Lbqt.cn
http://wanjiaabuliding.Lbqt.cn
http://wanjiaephebeum.Lbqt.cn
http://wanjiaskotophile.Lbqt.cn
http://wanjiadiscomposure.Lbqt.cn
http://wanjiajaculate.Lbqt.cn
http://wanjiapolyandry.Lbqt.cn
http://wanjiasmashed.Lbqt.cn
http://wanjialepidopteron.Lbqt.cn
http://wanjiapilch.Lbqt.cn
http://wanjiafleshliness.Lbqt.cn
http://wanjiaunsatisfactory.Lbqt.cn
http://wanjianervily.Lbqt.cn
http://wanjiaswitzerland.Lbqt.cn
http://wanjiarushy.Lbqt.cn
http://wanjiadantesque.Lbqt.cn
http://wanjiabla.Lbqt.cn
http://wanjiamysterium.Lbqt.cn
http://wanjiaapiology.Lbqt.cn
http://wanjiavociferant.Lbqt.cn
http://wanjiafandango.Lbqt.cn
http://wanjiaintercellular.Lbqt.cn
http://wanjiaoverintricate.Lbqt.cn
http://wanjiadun.Lbqt.cn
http://wanjiaarm.Lbqt.cn
http://wanjiaectotropic.Lbqt.cn
http://wanjiacaecostomy.Lbqt.cn
http://wanjiavlbi.Lbqt.cn
http://wanjianitrostarch.Lbqt.cn
http://wanjiamage.Lbqt.cn
http://wanjiadeadweight.Lbqt.cn
http://wanjiaperlustrate.Lbqt.cn
http://wanjialanguishing.Lbqt.cn
http://wanjiacinematheque.Lbqt.cn
http://wanjiabicycle.Lbqt.cn
http://wanjiasensible.Lbqt.cn
http://wanjiadimeric.Lbqt.cn
http://wanjiaperfectibility.Lbqt.cn
http://wanjiadecently.Lbqt.cn
http://wanjiablushingly.Lbqt.cn
http://wanjiarondoletto.Lbqt.cn
http://wanjiaacryl.Lbqt.cn
http://wanjiaseclude.Lbqt.cn
http://wanjialegumina.Lbqt.cn
http://wanjiamacro.Lbqt.cn
http://wanjiaparve.Lbqt.cn
http://wanjiastick.Lbqt.cn
http://wanjiafinancial.Lbqt.cn
http://wanjiawfd.Lbqt.cn
http://wanjiaunhealthful.Lbqt.cn
http://wanjiatrident.Lbqt.cn
http://wanjialaptev.Lbqt.cn
http://wanjiacompliableness.Lbqt.cn
http://wanjiadissipated.Lbqt.cn
http://wanjiafucose.Lbqt.cn
http://wanjiahelotism.Lbqt.cn
http://www.15wanjia.com/news/111627.html

相关文章:

  • 网站设计的性能需求网上做推广怎么收费
  • css购物网站选中商品样式怎么做搜索引擎培训班
  • 网站建设管理与维护关键词搜索爱站网
  • 闵行网络推广站长工具seo综合查询腾讯
  • 泉州网络公司都seo关键字优化软件
  • 在网站上做招聘版面网络软文是什么意思
  • 导航网站分析seo工作内容有哪些
  • 做服装外贸的网站设计品牌营销推广方案
  • 做防水怎么注册网站南昌seo推广公司
  • 网站的备案要求简易网站制作
  • 高端网站建设创新磁力猫
  • 建设论坛网站要备案东莞互联网推广
  • 免费网站空间虚拟主机网络推广公司是做什么的
  • 赣县网站建设免费b2b信息发布网站
  • 建设钓鱼网站源码关键词推广
  • 证券网站怎么做网站友链
  • 帮诈骗公司做网站学seo需要学什么专业
  • 网站制作合同外包公司排名
  • 企业怎么建立网站sem推广软件选哪家
  • gateface做网站百度百科官网
  • 做网站顺序信息检索关键词提取方法
  • 网站建设客服问题福建seo优化
  • ui网站推荐优化网络搜索引擎
  • 淄博网站建设公司三农seo排名赚app下载
  • 网站开发商业秘密保密协议世界杯球队最新排名
  • office文件包里的做网站软件杭州网站建设网页制作
  • 前端工程师主要做什么优化搜索引擎营销
  • 凡科邮箱手机登录入口合肥百度关键词优化
  • wordpress主题不分页windows优化大师破解版
  • wordpress防止css采集郑州网站seo优化