Red de conocimiento informático - Problemas con los teléfonos móviles - ¡Este artículo explica la integración de Spring en Mybatis y lo guía paso a paso!

¡Este artículo explica la integración de Spring en Mybatis y lo guía paso a paso!

Antes de presentar los principios de integración entre Spring y Mybatis, primero debemos presentar el principio de funcionamiento de Mybatis.

En Mybatis, podemos usar interfaces para definir la ejecución de SQL. El código simplificado es el siguiente: define una interfaz y @Select significa ejecutar declaraciones SQL de consulta.

El siguiente es el código para ejecutar sql:

El propósito de Mybatis es permitir a los programadores ejecutar sql específico llamando a un método que encapsula la lógica subyacente de ejecutar sql. Aquí nos centramos en el siguiente objeto mapeador. Cuando se llama al método getMapper de SqlSession, se generará un objeto proxy a través de la interfaz. Para utilizar realmente este objeto proxy, al llamar al método del objeto proxy, Mybatis eliminará el método correspondiente. declaración sql, luego use JDBC para ejecutar la declaración sql, luego use JDBC para ejecutar la declaración sql y finalmente obtenga el resultado.

Luego, el atributo userMapper en UserService se inyectará automáticamente en Mybatis como proxy. Si depura el proyecto con la integración completa, puede ver que el tipo de userMapper es: org.apache.ibatis.binding.MapperProxy@41a0aa7d. Esto demuestra que de hecho es un proxy Mybatis. Bien, ahora la pregunta que tenemos que resolver es: ¿Cómo colocar el objeto proxy Mybatis como un bean en el contenedor Spring? Para resolver este problema, necesitamos comprender el proceso de generación de beans de Spring.

Durante el proceso de inicio de Spring, el Bean se generará mediante los siguientes pasos

Supongamos que hay una clase A y el código es el siguiente: Una clase A

Una clase B, sin anotación @Component

Ejecute el siguiente código:

El resultado de salida es: com.luban.util .A@6acdbdf5 El tipo de objeto Bean correspondiente a la clase A sigue siendo clase A. Pero esta conclusión no es segura. Podemos usar el postprocesador BeanFactory para modificar BeanDefinition. Agregamos un postprocesador BeanFactory:

Esto hará que el BeanDefiniton original correspondiente a la clase A se modifique a B. clase, entonces el tipo de objeto bean generado normalmente es clase B. En este caso, llamar al siguiente código informará lo siguiente. En este momento, llamar al siguiente código informará un error:

Pero llamar al siguiente código no informará un error, incluso si no hay @Component anotación en la clase B:

p>

Y el siguiente código devolverá: com.luban.util.B@4b1c1ea0

El motivo es para ilustrar un problema: en Los objetos y clases de Spring, Bean no son lo mismo. En Spring, los objetos Bean no están directamente relacionados con clases, sino con BeanDefinitions. Entonces, volvamos al problema que estamos tratando de resolver: ¿Cómo poner un proxy Mybatis como un bean en un contenedor Spring? En Spring, si desea generar un Bean, primero debe convertirse en BeanDefinition, al igual que si desea crear una nueva instancia de objeto, primero debe tener una clase.

Volviendo a nuestro problema, ahora queremos generar un Bean, entonces debes convertirte en un BeanDefinition. Siempre que exista un BeanDefinition, entonces debes crear un BeanDefinition.

Al establecer el tipo de objeto Bean en BeanDefinition y luego agregar BeanDefinition a Spring, Spring nos ayudará a convertirlo en un objeto Bean correspondiente al tipo según las acciones de BeanDefinition. Entonces ahora tenemos que resolver dos problemas:

Nota: El postprocesador BeanFactory que usamos anteriormente solo puede modificar BeanDefinition, no agregar una nueva BeanDefinition. Si desea agregar un BeanDefinition utilizando la técnica de importación, puede consultar el pseudocódigo para implementar esta idea.

Supongamos que tenemos una interfaz UserMapper con un proxy de tipo UserMapperProxy. En pseudocódigo, lo pensamos así:

Pero aquí hay un problema grave, es decir, se supone que el UserMapperProxy anterior es el tipo de clase de proxy. Sin embargo, el objeto proxy en Mybatis se implementa utilizando la tecnología de proxy dinámico de JDK, lo que significa que la clase de proxy del objeto proxy se genera dinámicamente y no podemos determinar cuál es la clase de proxy del objeto proxy. Ahora volvamos a nuestra pregunta: ¿Cuál es el tipo de objeto proxy Mybatis? Hay dos respuestas posibles: 1. Objeto proxy correspondiente a la clase de proxy 2. Objeto proxy correspondiente a la interfaz Entonces la respuesta 1 es igual a no, porque la clase de proxy se genera dinámicamente, así que echemos un vistazo a la respuesta 2: Correspondiente a la interfaz Si adoptamos la respuesta 2, nuestra idea es:

Pero, de hecho, no es factible establecer el tipo en BeanDefinition correspondiente a la interfaz. Sin embargo, en realidad configurar el tipo de BeanDefinition en una interfaz no funciona porque Spring no tiene forma de crear nuevas instancias del tipo correspondiente según BeanDefinition, y las interfaces no pueden crear nuevas instancias directamente. Entonces ahora la pregunta es: ¿Cuál es el tipo de proxy Mybatis? Estas dos respuestas son no, por lo que el problema no está resuelto, por lo que no podemos pensar en esta línea de pensamiento y solo podemos volver al punto inicial del problema: ¿Cómo podemos colocar el objeto proxy Mybatis como un Bean en el ¿Contenedor de primavera?

Para resumir el razonamiento anterior: esperamos establecer el tipo de clase de BeanDefinition, y luego Spring nos ayudará automáticamente a generar el Bean correspondiente, pero esta ruta no funciona. Solución definitiva Entonces, ¿hay alguna otra forma de generar beans? Spring no puede completar la lógica de generar beans, debemos hacerlo nosotros mismos. Podemos usar FactoryBean para personalizar los objetos Bean que queremos generar. Por ejemplo,

Definimos un LubanFactoryBean, que implementa FactoryBean, y el método getObject se usa para personalizar la lógica de generación de objetos Bean. El método getObject se utiliza para personalizar la lógica de generación de objetos Bean. 3712b94 clase lubanFactoryBean: clase com.sun.proxy.LubanFactoryBean. Proxy20 A partir de los resultados, podemos ver que el objeto Bean llamado "lubanFactoryBean" en el contenedor Spring es un objeto proxy generado por nuestro proxy dinámico jdk personalizado.

Por lo tanto, puede obtener el objeto Bean llamado "lubanFactoryBean" del contenedor Spring.

Por lo tanto, podemos agregar objetos Bean personalizados al contenedor Spring a través de FactoryBean.

El LubanFactoryBean definido anteriormente corresponde a UserMapper, lo que significa que definimos un LubanFactoryBean, lo que equivale a colocar el objeto proxy correspondiente a UserMapper como un bean en el contenedor. Pero como programadores, nos resulta imposible definir un LubanFactoryBean para cada Mapper, lo que sería muy problemático. Modificaremos LubanFactoryBean para hacerlo más general, por ejemplo:

Después de modificar LubanFactoryBean, LubanFactoryBean se puede utilizar como proxy para UserMapper. LubanFactoryBean ahora es lo suficientemente flexible como para pasar diferentes interfaces de mapeador a través de la construcción al construir un LubanFactoryBean. De hecho, LubanFactoryBean también es un Bean. Podemos generar un LubanFactoryBean generando un BeanDefinition y estableciendo diferentes valores para los parámetros del constructor, por ejemplo, en el siguiente pseudocódigo:

Atención especial. al segundo, que indica que el BeanDefinition actual genera objetos bean llamando al constructor LubanFactoryBean y pasando el objeto de clase UserMapper. Luego, al generar LubanFactoryBean, el objeto proxy correspondiente a la interfaz UserMapper se generará como un bean. En este punto, hemos resuelto el problema que queremos resolver: colocar el objeto proxy de Mybatis en el contenedor Spring como un Bean.

Es solo que usamos un proxy JDK simple para simular el proxy Mybatis. Si tuviéramos tiempo, podríamos haber usado los métodos proporcionados en Mybatis para generar un proxy. No dedicaremos tiempo a presentarlo aquí. Importar En este punto, nos queda una cosa por hacer, que es cómo definir realmente un BeanDefinition y agregarlo a Spring. Tomando como ejemplo la tecnología de importación que queremos usar mencionada anteriormente, se puede implementar de esta manera: Definición La siguiente clase:

Y agregue la anotación @Import en AppConfig:

Esto agregará una nueva BeanDefinition al iniciar Spring, BeanDefinition generará un objeto LubanFactoryBean y generará un objeto LubanFactoryBean. se pasará al objeto UserMapper.class y el objeto UserMapper.class se pasará a través del objeto LubanFactoryBean. La lógica interna de LubanFactoryBean es equivalente a generar automáticamente un bean como objeto proxy de la interfaz UserMapper.

En resumen, a través de nuestro análisis, para integrar Spring y Mybatis, debemos hacer lo siguiente:

Autor: Programador Zhou Yu

Enlace :/post/7089023062800236552