Descripción general
El módulo SIGNG-AOP es el módulo de núcleo en el marco de resorte. Aunque el contenedor Spring IOC no depende de AOP, AOP proporciona una solución poderosa y flexible para la implementación de COI.
En el marco de primavera, AOP se usa principalmente para dos fines:
Desde una perspectiva funcional, AOP puede considerarse como un complemento del método de programación OOP, proporcionando una forma diferente de organización de código o sistema. El concepto central en OOP es clase, y en AOP es un aspecto.
El módulo SIGNG-AOP es el módulo de núcleo en el marco de resorte. Aunque el contenedor Spring IOC no depende de AOP, AOP proporciona una solución poderosa y flexible para la implementación de COI.
En el marco de primavera, AOP se usa principalmente para dos fines:
Spring AOP se implementa en Java puro, y no requiere un procesamiento de compilación especial y no requiere el control de la jerarquía del cargador de clase, por lo que se puede usar para contenedores de servlet y otros servidores de aplicaciones.
Spring AOP actualmente solo admite la conmutación o intercepción a nivel de método, y la intercepción de atributos no es compatible ahora. Si desea interceptar atributos, puede considerar usar el lenguaje SuppeJ.
Spring AOP se usa de manera diferente a la mayoría de los otros marcos AOP. Su objetivo principal no es proporcionar un conjunto grande e integral de implementaciones de AOP, sino integrar diferentes implementaciones de AOP y colaborar con Spring IOC para ayudar a resolver algunos problemas comunes.
Cabe señalar que algunos aconsejados de grano fino (como el modelo de dominio), Spring AOP a menudo no proporciona un buen apoyo, y este escenario aún considera el aspecto. Aun así, en la experiencia general, el poderoso mecanismo de Spring AOP aún puede resolver los problemas en la mayoría de los escenarios.
Entonces, ¿cómo debemos ver Spring AOP y AspectJ, citando el texto original de los documentos oficiales de Spring:
Spring AOP nunca tendrá dificultades para competir con SuppeJ para proporcionar una solución integral de AOP. Creemos que tanto los marcos basados en el proxy como Spring AOP como los marcos completos como el aspecto de SuppectJ son valiosos y que están completos, en lugar de competir. Spring integra sin problemas AOP e IOC con SUPSJ, para permitir que todos los usos de AOP sean atendidos dentro de una arquitectura de aplicación constante basada en primavera. Esta integración no afecta la API de AOP de primavera o la API de AOP Alliance: Spring AOP permanece compatible con hacia atrás.
En todos los diseños de módulos de marco de Spring, uno de los principios principales a los que siempre se cumple no es invasivo.
Por lo tanto, al usar Spring AOP, no nos obligaremos a introducir clases o interfaces específicas en el Código de Negocio, lo que puede mantener el código limpio y decuple en la medida máxima. Sin embargo, Spring también proporciona otra opción, si hay un escenario específico, puede introducir directamente el AOP de Spring en su código. Casi todos los módulos en los marcos de primavera le darán una variedad de opciones en la forma en que se usan para que los usuarios puedan elegir una forma que sea más adecuada para sus escenarios. Utilice SuppeJ o Spring AOP, use Anotación o método de configuración XML, depende de U.
Después de comprender los escenarios de intención y uso originales de Spring AOP, echemos un vistazo a su principio de implementación general
La mayoría de los problemas en el mundo del software se pueden resolver agregando una capa.
La capa mencionada aquí es, por supuesto, en un sentido amplio, que puede ser una abstracción o un caché, lo que significa aproximadamente la categoría de aislamiento y desacoplamiento.
En el mundo de la primavera, la introducción de cada módulo, o la integración de tecnologías de terceros, siempre proporcionará una capa de abstracción, proporcionando una API unificada a los usuarios, bloqueando todos los detalles de implementación y diferencias entre las diferentes implementaciones. Por ejemplo, los módulos como Spring-Cache, Spring-JDBC, Spring-JMS y Spirng-Messaging proporcionan una capa de abstracción.
La implementación de Spring AOP es un mecanismo basado en proxy, que utiliza el proxy dinámico JDK por defecto, y también puede usar el proxy CGLIB. La diferencia entre los dos es principalmente la diferencia entre los objetos que se proxen. Cuando el objeto de destino es una interfaz, el proxy dinámico JDK puede completar el proxy, pero cuando el objeto de destino no implementa la clase de interfaz (intente ser menos, la programación orientada a la interfaz es un buen hábito), es necesario usar proxy CGLIB para completar el proxy. Por supuesto, también puede obligar a la interfaz a usar CGLIB como proxy; Además, cuando los tipos específicos deben ser inyectados o referenciados, si el objeto referenciado es exactamente el objeto proxy, también debe usar el método CGLIB.
El diseño y la implementación funcional se pueden dividir en dos partes principales
Creación de AOP
La clase central que genera el objeto proxy, proxyFactoryBean getObject ()
La siguiente figura es la lógica de selección de si usar JDK o CGLIB al generar un proxy:
Después de encontrar el ejecutor específico del agente de la generación, ¿cuándo se llama a esta operación? Aquellos que han entendido el ciclo de vida de los frijoles de primavera deben saber que cuando se crea un frijol, hay una serie de interfaces de devolución de llamada para que los usuarios inserten comportamientos personalizados para influir en algunas de las características del bean. BeanPostProcessor es una de las interfaces. Se han introducido artículos anteriores (el arma definitiva para jugar con los frijoles de primavera). Spring AOP aprovechó esta oportunidad para insertar un truco en el proceso de crear un frijol. Si el bean que se está creando es nuestro objetivo AOP, cree un proxy y finalmente devuelva el objeto proxy al COI.
AbstractAutOproxyCreator Esta clase es una implementación de BeanPostProcessor, utilizado para crear un proxy, consulte el método de postprocesamiento de este procesador y finalmente devuelve el proxy devuelto por el método CreateProxy ().
Ejecución mejorada de secciones AOP
Se puede entender como una llamada a todas las cadenas de interceptor en el objeto objetivo
Dado que hay dos implementaciones específicas de Spring AOP, JDK Dynamic Proxy y CGLIB, los métodos para ejecutar interceptores son diferentes. Para más detalles, puede leer el código fuente JDKDYNAMICAOPPROXY Método de Invoke
La llamada al método de destino finalmente se basa en reflectivemethodinvocation.
El procesamiento del proceso en reflectivemetodinvocation utiliza un método recursivo para procesar las cadenas de interceptor.
Método de intercepción de cglibaopproxy
Cglibmetodinvocation hereda reflectivemetodinvocation, y el método de proceso () anterior se utiliza para manejar las cadenas de interceptor.
Dos detalles a tener en cuenta al usar Spring AOP:
1. Spring AOP no funciona al llamar al método dentro de la clase (auto-invoque), porque la llamada interna no pasa el objeto proxy y se usa directamente. Las soluciones son:
2. Al inyectar frijoles, si desea inyectar el tipo específico de frijoles en lugar de la interfaz, use cglib
Spring AOP tiene funciones potentes y un diseño inteligente. El contexto principal se resuelve aquí, y los detalles no se discutirán uno por uno.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.