对代码delegate.parseCustomElement(ele);进行深入分析
对于dubbo就是使用了spring自定义标签解析的功能特性。Spring自定 义标签解析的过程如下:
- 创建一个需要扩展的组件
- 定义一个XSD描述文件内容
- 创建一个类实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件中的定义
- 创建一个Handler组件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器
- 编写Spring.handlers和Spring.schemas文件
现在开始依据上面的步骤开始使用自定义标签解析
1.创建一个类用来接收配置文件中的属性
public class People { private String id; private String name; private Integer age; // 省略get/set方法
- 创建一个xsd文件描述xml语法约束
-
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://blog.csdn.net/cutesource/schema/people" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:beans="http://www.springframework.org/schema/beans" targetNamespace="http://blog.csdn.net/cutesource/schema/people" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xsd:import namespace="http://www.springframework.org/schema/beans" /> <xsd:element name="people"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="beans:identifiedType"> <xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="age" type="xsd:int" /> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> </xsd:schema> 在xsd定义了age 和name属性,与people实体里面的属性一一对应
- 创建一个文件,实现BeanDefinitionParser接口,解析XSD和XML文件中的定义
-
package com.spring.test.parser; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.util.StringUtils; import org.w3c.dom.Element; import com.spring.test.pojo.People; public class PeopleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser { // Element对应的类 @Override protected Class getBeanClass(Element element) { return People.class; } // 从element中解析并提取对应元素 @Override protected void doParse(Element element, BeanDefinitionBuilder bean) { String name = element.getAttribute("name"); String age = element.getAttribute("age"); String id = element.getAttribute("id"); if (StringUtils.hasText(id)) { // 将提取的数据放入BeanDefinitionBuilder 中,待解析完成后放入统一注册到beanFactory bean.addPropertyValue("id", id); } if (StringUtils.hasText(name)) { bean.addPropertyValue("name", name); } if (StringUtils.hasText(age)) { bean.addPropertyValue("age", Integer.valueOf(age)); } } }