Tabla de contenido
En segundo lugar, la estructura del directorio del proyecto
En tercer lugar, el uso de etiquetas personalizadas.
2. Defina un archivo XSD para describir el contenido del componente.
5. Escriba los archivos Spring.handlers y Spring.schemas
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.