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

默认标签解析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、 

二、alias标签的处理

	protected void processAliasRegistration(Element ele) {
		String name = ele.getAttribute(NAME_ATTRIBUTE);
		String alias = ele.getAttribute(ALIAS_ATTRIBUTE);
		boolean valid = true;
		if (!StringUtils.hasText(name)) {
			getReaderContext().error("Name must not be empty", ele);
			valid = false;
		}
		if (!StringUtils.hasText(alias)) {
			getReaderContext().error("Alias must not be empty", ele);
			valid = false;
		}
		if (valid) {
			try {
				getReaderContext().getRegistry().registerAlias(name, alias);
			}
			catch (Exception ex) {
				getReaderContext().error("Failed to register alias '" + alias +
						"' for bean with name '" + name + "'", ele, ex);
			}
			getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));
		}
	}

三、bean标签的处理


	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		if (bdHolder != null) {
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
			try {
				// Register the final decorated instance.
				BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
			}
			catch (BeanDefinitionStoreException ex) {
				getReaderContext().error("Failed to register bean definition with name '" +
						bdHolder.getBeanName() + "'", ele, ex);
			}
			// Send registration event.
			getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
		}
	}

180444_BfbV_206123.png

以下就是我们最常见的用法:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"
	default-lazy-init="true" default-autowire="default">

	<bean name="dataSource" id="" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/t" />
		<property name="username" value="root" />
		<property name="password" value="password" />
		<meta key="1" value="1"/>
	</bean>
</beans>

首先是解析 bean中本身的属性,使用eclipse提示,可以看到有如下属性可以用到:

181853_jZ6c_206123.png 

相应的代码如下,这部分逻辑相应比较简单,就是判断是否有相应的属性,有的话设置值:

/**
	 * Apply the attributes of the given bean element to the given bean * definition.
	 * @param ele bean declaration element
	 * @param beanName bean name
	 * @param containingBean containing bean definition
	 * @return a bean definition initialized according to the bean element attributes
	 */
	public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,
			BeanDefinition containingBean, AbstractBeanDefinition bd) {

		if (ele.hasAttribute(SINGLETON_ATTRIBUTE)) {
			error("Old 1.x 'singleton' attribute in use - upgrade to 'scope' declaration", ele);
		}
		else if (ele.hasAttribute(SCOPE_ATTRIBUTE)) {
			bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE));
		}
		else if (containingBean != null) {
			// Take default from containing bean in case of an inner bean definition.
			bd.setScope(containingBean.getScope());
		}

		if (ele.hasAttribute(ABSTRACT_ATTRIBUTE)) {
			bd.setAbstract(TRUE_VALUE.equals(ele.getAttribute(ABSTRACT_ATTRIBUTE)));
		}

		String lazyInit = ele.getAttribute(LAZY_INIT_ATTRIBUTE);
		if (DEFAULT_VALUE.equals(lazyInit)) {
			lazyInit = this.defaults.getLazyInit();
		}
		bd.setLazyInit(TRUE_VALUE.equals(lazyInit));

		String autowire = ele.getAttribute(AUTOWIRE_ATTRIBUTE);
		bd.setAutowireMode(getAutowireMode(autowire));

		String dependencyCheck = ele.getAttribute(DEPENDENCY_CHECK_ATTRIBUTE);
		bd.setDependencyCheck(getDependencyCheck(dependencyCheck));

		if (ele.hasAttribute(DEPENDS_ON_ATTRIBUTE)) {
			String dependsOn = ele.getAttribute(DEPENDS_ON_ATTRIBUTE);
			bd.setDependsOn(StringUtils.tokenizeToStringArray(dependsOn, MULTI_VALUE_ATTRIBUTE_DELIMITERS));
		}

		String autowireCandidate = ele.getAttribute(AUTOWIRE_CANDIDATE_ATTRIBUTE);
		if ("".equals(autowireCandidate) || DEFAULT_VALUE.equals(autowireCandidate)) {
			String candidatePattern = this.defaults.getAutowireCandidates();
			if (candidatePattern != null) {
				String[] patterns = StringUtils.commaDelimitedListToStringArray(candidatePattern);
				bd.setAutowireCandidate(PatternMatchUtils.simpleMatch(patterns, beanName));
			}
		}
		else {
			bd.setAutowireCandidate(TRUE_VALUE.equals(autowireCandidate));
		}

		if (ele.hasAttribute(PRIMARY_ATTRIBUTE)) {
			bd.setPrimary(TRUE_VALUE.equals(ele.getAttribute(PRIMARY_ATTRIBUTE)));
		}

        //指定了init-method的话使用指定的值
		if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
			String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);
			if (!"".equals(initMethodName)) {
				bd.setInitMethodName(initMethodName);
			}
		}
		else {
            //没指定的情况下,如果设置了默认的值的话使用默认的值
            //默认的值在beans标签里面定义
			if (this.defaults.getInitMethod() != null) {
				bd.setInitMethodName(this.defaults.getInitMethod());
				bd.setEnforceInitMethod(false);
			}
		}

		if (ele.hasAttribute(DESTROY_METHOD_ATTRIBUTE)) {
			String destroyMethodName = ele.getAttribute(DESTROY_METHOD_ATTRIBUTE);
			bd.setDestroyMethodName(destroyMethodName);
		}
		else {
			if (this.defaults.getDestroyMethod() != null) {
				bd.setDestroyMethodName(this.defaults.getDestroyMethod());
				bd.setEnforceDestroyMethod(false);
			}
		}

		if (ele.hasAttribute(FACTORY_METHOD_ATTRIBUTE)) {
			bd.setFactoryMethodName(ele.getAttribute(FACTORY_METHOD_ATTRIBUTE));
		}
		if (ele.hasAttribute(FACTORY_BEAN_ATTRIBUTE)) {
			bd.setFactoryBeanName(ele.getAttribute(FACTORY_BEAN_ATTRIBUTE));
		}

		return bd;
	}

有一点值得注意的是,spring在beans标签中提供了默认的配置 :

182943_xnyr_206123.png

这些属性是封装在 org.springframework.beans.factory.xml.DocumentDefaultsDefinition 类中的,上面代码中的 this.defaults 就是该对象

	/**
	 * Parse the bean definition itself, without regard to name or aliases. May return
	 * {@code null} if problems occurred during the parsing of the bean definition.
	 */
	public AbstractBeanDefinition parseBeanDefinitionElement(
			Element ele, String beanName, BeanDefinition containingBean) {

		this.parseState.push(new BeanEntry(beanName));

		String className = null;
		if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
			className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
		}

		try {
			String parent = null;
			if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
				parent = ele.getAttribute(PARENT_ATTRIBUTE);
			}
            //生成一个AbstractBeanDefinition实例
            //AbstractBeanDefinition代表了一个bean定义,是xml --> java 的体现
			AbstractBeanDefinition bd = createBeanDefinition(className, parent);

            //解析bean中属性如 lazy-loading, scope等
			parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);

            //decription子元素
			bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
            //解析meta元素
			parseMetaElements(ele, bd);
            //解析lookup元素
			parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
            //解析
			parseReplacedMethodSubElements(ele, bd.getMethodOverrides());

			parseConstructorArgElements(ele, bd);
            //解析property
			parsePropertyElements(ele, bd);
			parseQualifierElements(ele, bd);

			bd.setResource(this.readerContext.getResource());
			bd.setSource(extractSource(ele));

			return bd;
		}
		catch (ClassNotFoundException ex) {
			error("Bean class [" + className + "] not found", ele, ex);
		}
		catch (NoClassDefFoundError err) {
			error("Class that bean class [" + className + "] depends on not found", ele, err);
		}
		catch (Throwable ex) {
			error("Unexpected failure during bean definition parsing", ele, ex);
		}
		finally {
			this.parseState.pop();
		}

		return null;
	}

 

四、

转载于:https://my.oschina.net/u/206123/blog/1547395

相关文章:

  • 数据库书上概念摘抄
  • c#中取整,向上取,向下取
  • 最近开始温习C#
  • Steve Thair谈DevOps on Windows的演变与面临的挑战
  • [MFC] MFC 获取指定窗口截图(大小可调)
  • 年末裁员事件背后的启示录(2)
  • 谈谈基于Kerberos的Windows Network Authentication
  • 真人拳皇项目第三次Scrum总结——史经浩
  • pietty
  • 人性
  • 并非都完美,笔记本8大致命缺陷曝光
  • SDO_Geometry说明
  • GDI对象导致内存泄露
  • CCNA 笔记整理之IP路由(持续更新)
  • 一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体(转...
  • 【译】JS基础算法脚本:字符串结尾
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Bytom交易说明(账户管理模式)
  • download使用浅析
  • js操作时间(持续更新)
  • mongo索引构建
  • mysql innodb 索引使用指南
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python 反序列化安全问题(二)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 构建二叉树进行数值数组的去重及优化
  • 利用DataURL技术在网页上显示图片
  • 两列自适应布局方案整理
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #include到底该写在哪
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • ${factoryList }后面有空格不影响
  • (3)STL算法之搜索
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (七)Java对象在Hibernate持久化层的状态
  • (三)终结任务
  • (算法)Travel Information Center
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ***监测系统的构建(chkrootkit )
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core 2.1路线图
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .sh
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [].slice.call()将类数组转化为真正的数组
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步