Spring bean自定义标签解析注册原理

Spring 容器的基本实现原理

1.1 主要类:

AbstractSingleBeanDefinitionParser :继承自BeanDefinitionParser接口,用于对XSD解析
NamespaceHandlerSupport:用于注册组件

1.2 创建自定义标签流程:

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

1.3 实现自定义标签:

(1) 首先我们定义一个普通的POJO

package com.gz.spring.customElement;

public class User {

    private String userName;
    private String email;
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Override
    public String toString() {
        return "User [userName=" + userName + ", email=" + email + "]";
    }


}

(2) 定义一个XSD文件描述内容

<?xml version="1.0" encoding="UTF-8"?>    
<schema xmlns="http://www.w3.org/2001/XMLSchema"    
    xmlns:tns="http://www.gz.com/schema/user" 
    targetNamespace="http://www.gz.com/schema/user"    
    elementFormDefault="qualified">    
    <element name="user">    
        <complexType>    
            <attribute name="id" type="string" />    
            <attribute name="userName" type="string" />    
            <attribute name="email" type="string" />    
        </complexType>    
    </element>    
</schema>  

(3) 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义

package com.gz.spring.customElement;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {    
    @Override    
    protected Class<?> getBeanClass(Element element) {    
        return User.class;    
    }    
    @Override    
    protected void doParse(Element element, BeanDefinitionBuilder builder) {    
        String userName=element.getAttribute("userName");    
        String email=element.getAttribute("email");    
        if(StringUtils.hasText(userName)){    
            builder.addPropertyValue("userName", userName);    
        }    
        if(StringUtils.hasText(email)){    
            builder.addPropertyValue("email", email);    
        }    
    }    
}  

(4) 创建一个Handler文件,扩展NamespaceHandlerSupport,目的是将组件注册到Spring容器中。

package com.gz.spring.customElement;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class MyUserNamespaceHandler extends NamespaceHandlerSupport {

    @Override
    public void init() {
         registerBeanDefinitionParser("user",new UserBeanDefinitionParser());    
    }

}

(5) 编写spring.handlers和spring.schemas文件,默认位置在工程/META-INF/文件下

spring.handlers:

http\://www.gz.com/schema/user=com.gz.spring.customElement.MyUserNamespaceHandler

spring.schemas:

http\://www.gz.com/schema/user.xsd=META-INF/spring-user.xsd

Spring bean默认标签解析注册原理

猜你喜欢

转载自blog.csdn.net/u010811939/article/details/80362728