Análisis profundo del código fuente de Spring (segunda edición): uso de etiquetas personalizadas

Tabla de contenido

I. Introducción

1. Introducción

2. Versión de la herramienta

En segundo lugar, la estructura del directorio del proyecto

En tercer lugar, el uso de etiquetas personalizadas.

1. Crea un POJO

2. Defina un archivo XSD para describir el contenido del componente.

3. Cree una clase que herede la interfaz AbstractSingleBeanDefinitionParser para analizar las definiciones y las definiciones de los componentes en el archivo XSD.

4. Cree un archivo Handler, extendido desde NamespaceHandlerSupport, el propósito es registrar el componente en el contenedor Spring.

5. Escriba los archivos Spring.handlers y Spring.schemas

6. Cree un archivo de configuración de prueba y, después de introducir el espacio de nombres correspondiente y el XSD en el archivo de configuración, puede usar directamente la etiqueta personalizada.

7. Prueba


I. Introducción

1. Introducción

"Análisis profundo del código fuente de Spring (segunda edición)" Capítulo 4 Análisis de etiquetas predeterminadas Sección 1 Uso de etiquetas personalizadas, debe comprender el proceso de uso de etiquetas personalizadas antes de aprender a analizar. Este artículo se prueba de acuerdo con el contenido de la etiqueta personalizada en el libro.

2. Versión de la herramienta:

IntelliJ IDEA 2019.1.2

versión de Java "1.8.0_77"

Spring versión 5.2.0.BUILD-SNAPSHOT

En segundo lugar, la estructura del directorio del proyecto

Solo mire el archivo en el marco rojo (agregue un módulo al código fuente descargado para probarlo)

En tercer lugar, el uso de etiquetas personalizadas.

        En muchos casos, necesitamos proporcionar soporte configurable para el sistema.Los métodos simples se pueden configurar directamente basados ​​en los beans estándar de Spring, pero cuando la configuración es más complicada o requiere un control más rico, será muy torpe. El enfoque general es analizar el archivo XML definido de la forma ecológica original y luego convertirlo en un objeto de configuración. Este método ciertamente puede resolver todos los problemas, pero es más engorroso de implementar, especialmente cuando la configuración es muy complicada, el trabajo de análisis es una carga que hay que tener en cuenta. Spring proporciona soporte para Schema extensible, que es un buen compromiso.Extender la configuración de etiquetas personalizadas de Spring generalmente requiere los siguientes pasos (siempre que el paquete principal de Spring se agregue al proyecto).

  • Cree un componente que deba ampliarse.
  • Defina un archivo XSD para describir el contenido del componente.
  • Cree un archivo que implemente la interfaz BeanDefinitionParser para analizar las definiciones y componentes en el archivo XSD
  • definición.
  • Cree un archivo Handler, extendido desde NamespaceHandlerSupport, el propósito es registrar el componente en Spring
  • envase.
  • Escriba archivos Spring.handlers y Spring.schemas.
  • Ahora seguiremos los pasos anteriores para guiar a los lectores a través del proceso de etiquetado personalizado paso a paso.

1. Crea un POJO

Usuario

package com.asyf.chapter04;

public class User {

	private String id;

	private String userName;

	private String email;

	public String getId() {
		return id;
	}

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

	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{" +
				"id='" + id + '\'' +
				", userName='" + userName + '\'' +
				", email='" + email + '\'' +
				'}';
	}
}

2. Defina un archivo XSD para describir el contenido del componente.

user.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
		targetNamespace="http://www.lexueba.com/schema/user"
		xmlns:tns="http://www.lexueba.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. Cree una clase que herede la interfaz AbstractSingleBeanDefinitionParser para analizar las definiciones y las definiciones de los componentes en el archivo XSD.

package com.asyf.chapter04;

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 {

	// Element对应的类
	protected Class getBeanClass(Element element) {
		return User.class;
	}

	// 从element中解析并提取对应的元素
	protected void doParse(Element element, BeanDefinitionBuilder beanDefinitionBuilder) {
		String id = element.getAttribute("id");
		String userName = element.getAttribute("userName");
		String email = element.getAttribute("email");
		// 将提取的数据放到BeanDefinitionBuilder中,待完成所有bean的解析后统一注册到BeanFactory中
		if (StringUtils.hasText("id")) {
			beanDefinitionBuilder.addPropertyValue("id", id);
		}
		if (StringUtils.hasText(userName)) {
			beanDefinitionBuilder.addPropertyValue("userName", userName);
		}
		if (StringUtils.hasText(email)) {
			beanDefinitionBuilder.addPropertyValue("email", email);
		}
	}

}

Nota: Lo que está escrito en el libro es: cree un archivo que implemente la interfaz BeanDefinitionParser para analizar las definiciones y las definiciones de los componentes en el archivo XSD. Vea el diagrama de clases, AbstractSingleBeanDefinitionParser implementa la interfaz BeanDefinitionParser.

4. Cree un archivo Handler, extendido desde NamespaceHandlerSupport, el propósito es registrar el componente en el contenedor Spring.

package com.asyf.chapter04;

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

public class MyNamespaceHandler extends NamespaceHandlerSupport {

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

}

5. Escriba los archivos Spring.handlers y Spring.schemas

La ubicación predeterminada está en la carpeta / META-INF / del proyecto. Por supuesto, puede cambiar la ruta extendiendo Spring o modificando el código fuente.

  • manipuladores de resorte

http \: //www.lexueba.com/schema/user=com.asyf.chapter04.MyNamespaceHandler

  • Spring.schemas

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

6. Cree un archivo de configuración de prueba y, después de introducir el espacio de nombres correspondiente y el XSD en el archivo de configuración, puede usar directamente la etiqueta personalizada.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:myname="http://www.lexueba.com/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.lexueba.com/schema/user http://www.lexueba.com/schema/user.xsd">

    <myname:user id="testbean" userName="aaa" email="[email protected]"/>

</beans>

7. Prueba

package com.asyf.chapter04;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class MyTest {

	public static void main(String[] args) {
		BeanFactory bf = new XmlBeanFactory(new ClassPathResource("test.xml"));
		User user = (User) bf.getBean("testbean");
		System.out.println(user.toString());
	}

}

Impresión de consola:

La prueba esta completa.

Supongo que te gusta

Origin blog.csdn.net/cs373616511/article/details/107464844
Recomendado
Clasificación