spring IOC 之篇四:自定义标签的解析

对代码delegate.parseCustomElement(ele);进行深入分析

对于dubbo就是使用了spring自定义标签解析的功能特性。Spring自定 义标签解析的过程如下:

  1. 创建一个需要扩展的组件
  2. 定义一个XSD描述文件内容
  3. 创建一个类实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件中的定义
  4. 创建一个Handler组件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器
  5. 编写Spring.handlersSpring.schemas文件

现在开始依据上面的步骤开始使用自定义标签解析

1.创建一个类用来接收配置文件中的属性

public class People {
        private String id;  
        private String name;  
        private Integer age; 
// 省略get/set方法
  1. 创建一个xsd文件描述xml语法约束
  2. <?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实体里面的属性一一对应
    1. 创建一个文件,实现BeanDefinitionParser接口,解析XSDXML文件中的定义
    2. 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));  
              }  
          }  
      }

猜你喜欢

转载自www.cnblogs.com/histlyb/p/8983572.html