Springソース拡張ポイント3:カスタム構成ファイルタグ

Springの力は、Java開発者に大きな利便性を提供するだけでなく、そのオープンアーキテクチャにより、ユーザーがSpringを拡張する最大の能力を持つことができることです。

xmlを使用して春の情報を定義する場合、デフォルトの要素にはBean、bean、import、aliasの4つしか含まれません。その他のタグはカスタムタグであり、context、aopタグなどの対応する名前空間を導入する必要があります。

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
    
    
		if (delegate.isDefaultNamespace(root)) {
    
    
			NodeList 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);
		}
	}

対応するソースコードの処理は、DefaultBeanDefinitionDocumentReaderクラスのparseBeanDefinitionsメソッドにあります。

カスタムラベル要素

1.People.javaを定義します

public class People {
    
    
    private String id;
    private int age;
    private String name;
    private String address;

    public People(String id, int age, String name, String address) {
    
    
        this.id = id;
        this.age = age;
        this.name = name;
        this.address = address;
    }

    public People() {
    
    
    }

    public String getId() {
    
    
        return id;
    }

    public void setId(String id) {
    
    
        this.id = id;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getAddress() {
    
    
        return address;
    }

    public void setAddress(String address) {
    
    
        this.address = address;
    }

    @Override
    public String toString() {
    
    
        return "People{" +
                "id='" + id + '\'' +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

2. resources / META-INFディレクトリにpeople.xsd、spring.handlers、spring.schemasファイルを定義します

people.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.bobo.com/schema/people"
        xmlns:tns="http://www.bobo.com/schema/people"
        elementFormDefault="qualified">
    <element name="people">
        <complexType>
            <attribute name ="id" type = "string"/>
            <attribute name ="age" type = "int"/>
            <attribute name ="name" type = "string"/>
            <attribute name ="address" type = "string"/>
        </complexType>
    </element>
</schema>

spring.handlers

http\://www.bobo.com/schema/people=com.bobo.custom.PeopleNamespaceHandler

spring.schemas

http\://www.bobo.com/schema/people.xsd=META-INF/people.xsd

3.対応するnamespaceHandlerクラスPeopleNamespaceHandler.javaを作成します

package com.bobo.custom;

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

/**
 * @author bobo
 * @date 2020-10-20
 */

public class PeopleNamespaceHandler extends NamespaceHandlerSupport {
    
    
    @Override
    public void init() {
    
    
        super.registerBeanDefinitionParser("people",new PeopleBeanDefinitionParser());
    }
}

4.対応するBeanDefinitionParserクラスPeopleBeanDefinitionParser.javaを作成します

package com.bobo.custom;

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

/**
 * @author bobo
 * @date 2020-10-20
 */

public class PeopleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    
    
    @Override
    protected Class<?> getBeanClass(Element element) {
    
    
        return People.class;
    }

    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
    
    
        String id = element.getAttribute("id");
        String age = element.getAttribute("age");
        String name = element.getAttribute("name");
        String address = element.getAttribute("address");
        if (StringUtils.hasLength(id)){
    
    
            builder.addPropertyValue("id",id);
        }
        if (StringUtils.hasLength(age)){
    
    
            builder.addPropertyValue("age",age);
        }
        if (StringUtils.hasLength(name)){
    
    
            builder.addPropertyValue("name",name);
        }
        if (StringUtils.hasLength(address)){
    
    
            builder.addPropertyValue("address",address);
        }
    }
}

5.application-context.xml構成ファイルを作成します

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:bo="http://www.bobo.com/schema/people"
       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.xsd
            http://www.bobo.com/schema/people http://www.bobo.com/schema/people.xsd">

    <bo:people id="bo" age="20" name="bobo" address="广东省深圳市"></bo:people>

</beans>

6.テストクラスを作成します

package com.bobo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    
    

    public static void main(String[] args) {
    
    
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
        System.out.println(context.getBean("bo"));
    }
}

出力を実行

People{
    
    id='bo', age=20, name='bobo', address='广东省深圳市'}

おすすめ

転載: blog.csdn.net/u013277209/article/details/109186619