Spring AOP vs AspectJ

Tengo la impresión de que Spring AOP se utiliza mejor para tareas específicas de la aplicación, como seguridad, registro, transacciones, etc., ya que utiliza anotaciones Java5 personalizadas como marco. Sin embargo, AspectJ parece ser más amigable con los patrones de diseño.

¿Alguien puede resaltar los diversos pros y contras del uso de Spring AOP frente a AspectJ en una aplicación de Spring?

Spring-AOP Pros

  • Es más fácil de usar que AspectJ, ya que no tiene que usar LTW ( weaving en tiempo de carga ) o el comstackdor AspectJ.

  • Utiliza el patrón Proxy y el patrón Decorator

Spring-AOP Contras

  • Este es un AOP basado en proxy, por lo que básicamente solo puede usar puntos de unión de ejecución de método.
  • Los aspectos no se aplican cuando se llama a otro método dentro de la misma clase.
  • Puede haber un poco de tiempo de ejecución por encima.
  • Spring-AOP no puede agregar un aspecto a nada que no haya sido creado por la fábrica de Spring

AspectJ Pros

  • Esto es compatible con todos los puntos de unión. Esto significa que puedes hacer cualquier cosa.
  • Hay menos sobrecarga de tiempo de ejecución que la de Spring AOP.

AspectJ Contras

  • Ten cuidado. Compruebe si sus aspectos están tejidos solo para lo que deseaba tejer.
  • Necesita un proceso de comstackción extra con el comstackdor AspectJ o tiene que configurar LTW (tejer en tiempo de carga)

Además de lo que otros han declarado, solo para reformular, there are two major differences :

  1. Una está relacionada con el tipo de tejido.
  2. Otra para la definición de punto de unión.

Spring-AOP: Runtime weaving through proxy utilizando el concepto de dynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: tiempo de comstackción entretejiendo a través de AspectJ Java Tools(ajc compiler) si el origen está disponible o el tejido de post comstackción (usando archivos comstackdos). Además, se puede habilitar el tiempo de carga con Spring: necesita el archivo de definición aspectj y ofrece flexibilidad.

El tiempo de comstackción puede ofrecer beneficios de rendimiento (en algunos casos) y también la joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.

El manual del usuario de spring dará mucha información, directamente de la boca del caballo.

El capítulo 6.4 – Elegir qué estilo de statement AOP usar está muerto para ti, ya que analiza los pros y los contras de ambos.

El párrafo 6.1.2 – Capacidades de AOP de spring y los objectives y capítulos 6.2 – Soporte de @Aspect y 6.8 – El uso de AspectJ con las aplicaciones de Spring debe ser particularmente interesante.

Una nota adicional: si el rendimiento bajo alta carga es importante, querrás AspectJ, que es 9-35 veces más rápido que Spring AOP . 10ns vs 355ns podría no parecer mucho, pero he visto personas usando MUCHOS Aspectos. 10K de aspectos. En estos casos, su solicitud puede alcanzar miles de aspectos. En ese caso, está agregando ms a esa solicitud.

Ver los puntos de referencia .

Spring AOP es una de las partes esenciales del marco de spring. En la etapa muy básica, el marco de spring se basa en IoC y AOP. En el curso oficial de Spring hay una diapositiva en la que dice:

El AOP es una de las partes más importantes del marco.

El punto clave para entender cómo funciona AOP en Spring es que cuando escribas un Aspecto con Spring instrumentamos el framework para construir un proxy para tus objetos, con un JDKDynamicProxy si tu bean implementa una interfaz o vía CGLIB si tu bean no implementa cualquier interfaz Recuerde que debe tener cglib 2.2 en su class-path si está utilizando Spring antes de la versión 3.2. A partir de Spring 3.2 es inútil porque cglib 2.2 se incluyó en el núcleo.

El marco en la creación del bean creará un proxy que envolverá sus objetos y agregará responsabilidades de corte transversal como seguridad, gestión de transacciones, registro, etc.

La creación del proxy de esta forma se aplicará a partir de una expresión de corte puntual que instrumenta el marco para decidir qué beans y métodos se crearán como proxies. El consejo será más responsable que tu código. Recuerde que en este proceso el punto de corte captura solo los métodos públicos que no se declaran como finales.

Ahora, mientras que en Spring AOP, el Tejido de Aspectos será realizado por el contenedor al inicio del contenedor, en AspectJ debes realizar esto con una comstackción de tu código a través de la modificación del código de bytes. Por esta razón, en mi opinión, el enfoque de Spring es más simple y más manejable que AspectJ.

Por otro lado, con Spring AOP no puede usar toda la potencia de AOP porque la implementación se realiza mediante proxies y no mediante la modificación de su código.

Al igual que en AspectJ, puede usar tejido de tiempo de carga en SpringAOP. Puede beneficiarse de esta función que en spring se implementa con un agente y configuraciones especiales, @EnabledLoadWeaving o en XML. Puede usar el espacio de nombre como ejemplo. Sin embargo, en Spring AOP no puedes interceptar todos los casos. Por ejemplo, el new comando no es compatible con Spring AOP.

Sin embargo, en Spring AOP puede beneficiarse del uso de AspectJ a través del uso del método de fábrica en el bean de configuración de spring.

Por la razón de que Spring AOP es básicamente un proxy creado a partir del contenedor, por lo que puede usar AOP solo para los beans de spring. Mientras que con AspectJ puedes usar el aspecto en todos tus frijoles. Otro punto de comparación es la depuración y la previsibilidad del comportamiento del código. Con AOP de spring, el trabajo se realiza desde el comstackdor de Java y los aspectos son una forma muy buena para crear un proxy para su Spring Bean. En AspectJ, si modificas el código, necesitas más comstackción y entender dónde se tejen tus aspectos podría ser difícil. Incluso cerrar el tejido en spring es más sencillo: con el muelle, se elimina el aspecto de la configuración, se reinicia y funciona. ¡En AspectJ debes recomstackr el código!

En el tejido en tiempo de carga, AspectJ es más flexible que Spring porque Spring no admite todas las opciones de AspectJ. Pero en mi opinión, si desea cambiar el proceso de creación de un bean, una mejor manera es administrar el inicio de sesión personalizado en una fábrica y no con el tejido en tiempo de carga de un aspecto que cambie el comportamiento de su nuevo operador.

Espero que esta panorámica de AspectJ y Spring AOP te ayude a entender la diferencia de las dos pociones

Es importante considerar si sus aspectos serán críticos para la misión y dónde se implementará su código. Spring AOP significará que está confiando en el tejido de tiempo de carga. Esto puede fallar y, en mi experiencia, significa que pueden existir errores registrados, pero no impedirá que la aplicación se ejecute sin código de aspecto [Añadiría la advertencia de que es posible configurarlo de tal forma que este no sea el caso; pero no soy personalmente consciente de ello ]. El tejido en tiempo de comstackción evita esto.

Además, si usa AspectJ junto con el aspectj-maven-plugin, entonces puede ejecutar pruebas de unidad contra sus aspectos en un entorno de CI y tiene la seguridad de que los artefactos construidos se prueban y tejen correctamente. Si bien es cierto que puede escribir pruebas unitarias impulsadas por Spring, aún no tiene garantía de que el código implementado sea el que se probó si falla LTW.

Otra consideración es si aloja la aplicación en un entorno en el que puede supervisar directamente el éxito o el fracaso de un inicio de servidor / aplicación o si su aplicación se está implementando en un entorno en el que no está bajo su supervisión [por ejemplo, donde está alojado por un cliente]. Una vez más, esto señalaría el camino para comstackr el tejido del tiempo.

Hace cinco años, estaba mucho más a favor del AOP configurado de Spring por la simple razón de que era más fácil trabajar con él y menos probable que masticara mi IDE. Sin embargo, a medida que el poder de cómputo y la memoria disponible han aumentado, esto se ha convertido en un problema mucho menor y CTW con el aspectj-maven-plugin se ha convertido en una mejor opción en mi entorno de trabajo basado en las razones que he descrito anteriormente.