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='广东省深圳市'}