Uno de los análisis del archivo de configuración del código fuente de mybatis: análisis de etiquetas de propiedades

Como un marco ORM común para el desarrollo diario, mybatis desempeña un papel muy importante en el desarrollo, y comprender su código fuente es de gran ayuda para el desarrollo diario. La versión del código fuente es 3-3.4.x, que se puede descargar a github.

A partir de este artículo, analizaré el archivo de configuración central (mybatis-config.xml) de mybatis uno por uno. Hoy, veamos el proceso de resolución de la etiqueta de propiedades.

1. Descripción general
Cuando se usa mybatis solo, el archivo de configuración central (mybatis-config.xml) de mybatis es particularmente importante, que es la base de toda la operación de mybatis. Solo después de analizar correctamente las etiquetas en el archivo de configuración se pueden usar correctamente. Mybatis, mire la configuración de la etiqueta de propiedades a continuación, la función de la etiqueta de propiedades es cargar el archivo de propiedades o la etiqueta de propiedad, consulte la configuración específica a continuación, los ejemplos son los siguientes

<properties resource = "org / mybatis / example / config.properties">
<property name = "username" value = "dev_user" />
<property name = "password" value = "F2Fa3! 33TYyg" />
</ properties>
Lo anterior es la configuración de la etiqueta de propiedades configuradas, y el atributo de recurso y la subetiqueta de propiedades se configuran en la etiqueta. Veamos el proceso de análisis específico. Aquí analizamos el proceso de análisis de la pestaña de propiedades. No empecemos el proceso por ahora, solo mire el código de análisis.

En segundo lugar, detallado
anteriormente, vi la configuración de la etiqueta de propiedades, veamos su método de análisis, aquí solo pegue parte del código, a continuación se muestra el código del método de configuración de análisis,

Copie el código
privado void parseConfiguration (raíz XNode) {
intente {
// tema # 117 lea las propiedades primero
// Resuelva la etiqueta de
propiedades propertiesElement (root.evalNode ("propiedades"));
// Resuelva la etiqueta de
configuración Propiedades configuración = settingsAsProperties (root.evalNode ("configuración"));
loadCustomVfs (configuración);
// Resolver etiquetas de alias, por ejemplo <typeAlias ​​alias = "user" type = "cn.com.bean.User" />
typeAliasesElement (root.evalNode ("typeAliases")) ;
// Resuelve la etiqueta del
complemento pluginElement (root.evalNode ("plugins"));
// Resuelve la etiqueta objectFactory, la función de esta etiqueta es que mybatis usará ObjectFactory cada vez que se cree una nueva instancia del objeto resultante, si no se establece
// el valor predeterminado Use DefaultObjectFactory para crear, después de configurar, use el set
objectFactoryElement (root.evalNode ("objectFactory"));
// analizar etiquetas objectWrapperFactory
objectWrapperFactoryElement (root.evalNode ("objectWrapperFactory"));
// 解析 reflectorFactory 标签
reflectorFactoryElement (root.evalNode ("reflectorFactory"));
settingsElement (configuración);
// léelo después de objectFactory y objectWrapperFactory problema # 631
// 解析 entornos 标签 assetsElement
(root.evalNode ("entornos"));
databaseIdProviderElement (root.evalNode ("databaseIdProvider"));
typeHandlerElement (root.evalNode ("typeHandlers"));
// 解析 <mapeadores> 标签
mapperElement (root.evalNode ("mappers"));
} catch (Exception e) {
throw new BuilderException ("Error al analizar la configuración del asignador de SQL. Causa:" + e, e);



propertiesElement (root.evalNode ("propiedades"));
Este método es analizar la etiqueta de propiedades. Veamos el proceso de análisis específico a continuación.

1. Analice las etiquetas secundarias y el
código de copia de atributo
/ **
* Analice la etiqueta de propiedades en el archivo mybatis-config.xml
* <properties resource = "org / mybatis / example / config.properties">
* <property name = "username" value = "dev_user" />
* <nombre de la propiedad = "contraseña" valor = "F2Fa3! 33TYyg" />
* </ properties>
* Pasos de análisis:
* 1. Analice la etiqueta de propiedad configurada y colóquela en los valores predeterminados;
* 2. Analice El atributo de recurso o url se coloca en los valores predeterminados;
* 3. Obtenga el valor de la variable en la configuración y colóquelo en los valores predeterminados
* @param context
* @throws Exception
* /
private void propertiesElement (contexto XNode) arroja Exception {
if (context! = nulo) {
// 1, lea la etiqueta de propiedad en la etiqueta de propiedades <property name = "" value = "" />
Propiedades predeterminadas = context.getChildrenAsProperties ();
// 2, lea los atributos de recurso y url en la etiqueta de propiedades
String resource = context.getStringAttribute ("resource");
String url = context.getStringAttribute ("url");
// los atributos de recurso y url no pueden aparecer en la etiqueta de propiedades al mismo tiempo en
SI (!! recursos = null && URL = null) {
de banda nueva nueva BuilderException ( "de la Propiedades del elemento no pueden las especificar un URL y un recurso basado en la propiedad del archivo de referencia favor del Especifica uno o el otro ..");
}
// si el recurso Si no está vacío, se analizará como propiedades y se colocará en valores predeterminados. Dado que los valores predeterminados son una estructura de clave-valor, sobrescribirá el valor de la misma clave
si (recurso! = Nulo) {
defaults.putAll (Resources.getResourceAsProperties (recurso));
} sino if (url! = null) {// Si la url no está vacía, se analizará como propiedades y se colocará en valores predeterminados. Dado que los valores predeterminados son una estructura clave-valor, anulará el valor de la misma clave
defaults.putAll (Resources.getUrlAsProperties (url));
}
// 3. Obtenga el valor de la variable de variables en la configuración. Esta variable se puede pasar en el valor de la propiedad de propiedades a través de SqlSessionFactoryBuilder.build ()
Properties vars = configuration.getVariables ();
// Si la propiedad de propiedades se pasa cuando se llama a la compilación, Poner por defecto
if (vars! = Null) {
defaults.putAll (vars);
}
// poner en analizador y objetos de configuración
parser.setVariables (por defecto);
configuration.setVariables (por defecto);
}
}
Copie el código
de arriba Como puede ver en el proceso de análisis, primero analice la etiqueta secundaria de la etiqueta de propiedades, es decir, la etiqueta de propiedad, que se obtiene mediante el siguiente método,

// 1, lea la etiqueta de propiedad en la etiqueta de propiedades <property name = "" value = "" />
Properties defaults = context.getChildrenAsProperties ();
analice la etiqueta de propiedad y colóquela en el objeto Propiedades. Entonces, ¿cómo evitar el robo en el objeto Propiedades, en el método getChildrenAsProperties,

Copie el código
public Properties getChildrenAsProperties () {
Properties properties = new Properties ();
for (XNode child: getChildren ()) {
String name = child.getStringAttribute ("name");
String value = child.getStringAttribute ("value");
if (name! = null && value! = null) {
properties.setProperty (name, value);
}
}
return properties;
}
Copie el código
para ver que es una etiqueta de propiedad de bucle, obtenga sus propiedades de nombre y valor y colóquelo en el objeto de propiedades En.

Luego analice las propiedades de recursos y url de las propiedades de la siguiente manera

2 //, en el recurso lee las propiedades de la etiqueta, atributo url
String = context.getStringAttribute de recursos ( "recurso");
String url = context.getStringAttribute ( "URL");
respectivamente, y atributo url recursos, donde estas dos propiedades Todo es un camino.

2.
Mire este juicio a continuación para procesar los atributos ,

// Las propiedades de recursos y url no pueden aparecer en la etiqueta de propiedades al mismo tiempo
si (resource! = Null && url! =
Null ) { arroja una nueva BuilderException ("El elemento de propiedades no puede especificar una URL y una referencia de archivo de propiedad basada en recursos. Especifique uno o el otro. ");
}
Este juicio indica que en la etiqueta de propiedades, los recursos y los atributos de URL no pueden aparecer al mismo tiempo.

2.1 Manejo de los atributos de recursos y url
Veamos el procesamiento de los atributos de recursos y url. Aquí, los dos atributos de resource y url son ambos representativos de una ruta, por lo que definitivamente es necesario leer el archivo debajo de la ruta correspondiente.

Copie el código
// Si el recurso no está vacío, se analizará como propiedades y se colocará en valores predeterminados. Dado que los valores predeterminados son una estructura de clave-valor, sobrescribirá el valor de la misma clave
si (resource! = Null) {
defaults.putAll (Resources.getResourceAsProperties (resource));
} else if (url! = null) {// Si la url no está vacía, se analizará como propiedades y se colocará en valores predeterminados. Dado que los valores predeterminados son una estructura clave-valor, anulará el valor de los mismos
valores predeterminados clave . putAll (Resources.getUrlAsProperties (url));
}
Copie el código a
continuación para ver el procesamiento del recurso, llame al método Resources.getResourceAsProperties (resource)) para procesar el recurso,

Copie el código
Public static Properties getResourceAsProperties (String resource) lanza IOException {
Properties props = new Properties ();
InputStream in = getResourceAsStream (resource);
props.load (in);
in.close ();
return props;
}
Copie el código
desde arriba Se puede ver que el código se convierte en InputStream y finalmente se coloca en el objeto Propiedades, aquí el proceso detallado de carga del archivo y luego se analiza en detalle más adelante.

Veamos el procesamiento de la url, llame al método Resources.getUrlAsProperties (url) para procesar la url,

Copia el código
getUrlAsProperties estáticos públicos las propiedades (String urlString) throws IOException {
las propiedades de los apoyos = new new las propiedades ();
InputStream en getUrlAsStream = (el urlString);
props.load (en);
in.close ();
devolver los apoyos;
}
copiar el código
anterior El código aún procesa el archivo representado por url en un objeto Propiedades.

2.3 Procesamiento de las propiedades agregadas
Después de procesar la subetiqueta de propiedades, los recursos y los atributos de URL, también se realiza el siguiente procesamiento, es decir, obtener las propiedades de la configuración,

Copie el código
// 3, obtenga el valor de la variable de variables en la configuración, esta variable se puede pasar al valor de la propiedad de propiedades a través de SqlSessionFactoryBuilder.build ()
Propiedades vars = configuration.getVariables ();
// Si la propiedad de propiedades se pasa cuando se llama a la compilación , Ingrese los valores predeterminados
if (vars! = Null) {
defaults.putAll (vars);
}
Copie el código
Si la información de propiedades ya existe en la configuración, sáquela y colóquela en los valores predeterminados.

2.4. Póngalo en el objeto de configuración, realice
el proceso anterior y finalmente coloque toda la información de propiedades en la configuración,

// Póngalo en el analizador y los objetos de configuración
parser.setVariables (predeterminados);
configuration.setVariables (predeterminados);
Coloque los predeterminados en el atributo de variable de configuración, que representa toda la información de propiedades en todo el entorno mybatis. Esta información se puede usar en el archivo de configuración de mybatis usando $ {key}, por ejemplo, $ {username}, encontrará el valor del atributo cuya clave es el nombre de usuario de las variables de configuración y completará el reemplazo automático del valor del atributo.

En tercer lugar, se
analiza el análisis anterior del proceso de análisis de la etiqueta de propiedades: primero se analiza la etiqueta de propiedad, luego los atributos de recursos y url, y finalmente se utiliza el SqlSessionFactory para generar el SqlSessionFactoryBuilder. Hay claves duplicadas, luego la primera que se analizará será sobrescrita por el análisis posterior, es decir, el proceso de análisis es: propiedad subtag-> resource-> url-> developer set, luego el proceso de sobrescritura es: developer La subetiqueta set-> url-> resource-> property, la propiedad con la prioridad más alta la establece el propio desarrollador.

Supongo que te gusta

Origin www.cnblogs.com/ytg568524/p/12695335.html
Recomendado
Clasificación