Spring AOP vs AspectJ

178

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 destacar los diversos pros y contras del uso de Spring AOP vs AspectJ en una aplicación Spring?

babydudecoder
fuente
3
Cuando existe una anotación en Spring pero también en Java, ¿qué debe usar? Java. La misma lógica se aplica a esta funcionalidad. La primavera es primavera. hoy aquí, mañana ya no. (Recuerde que la gente usó Struts un poco antes de la primavera). AspectJ es la solución preferida a largo plazo. Durará más que la primavera. No estoy despidiendo a Spring, solo digo, para este aspecto ...: -;
desde el

Respuestas:

236

Spring-AOP Pros

  • Es más simple de usar que AspectJ, ya que no tiene que usar LTW ( tejido de tiempo de carga ) o el compilador de 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étodos.
  • Los aspectos no se aplican al llamar 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 tiempo de ejecución superior que el de Spring AOP.

AspectJ Contras

  • Ten cuidado. Comprueba si tus aspectos están entretejidos solo a lo que querías tejer.
  • Necesita un proceso de compilación adicional con AspectJ Compiler o tiene que configurar LTW (tejido de tiempo de carga)
Whiteship
fuente
20
@Configurable requiere el uso de AspecJ a través de Spring. De los documentos:If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
HDave
77
Otro inconveniente de Spring-Aop para mí son los rastreos largos ilegibles debido al enfoque basado en proxy
wrm
1
Parte confusa en la respuesta: ¿cómo es tener un poco de tiempo de ejecución por encima de un profesional para una herramienta y la posibilidad de tener un poco de tiempo de ejecución por encima de una estafa por la otra?
Moreaki
16
@Moreaki: Dijo "un poco por encima" como una estafa, y "un poco por encima" como profesional. La única diferencia 'a' es muy importante: en inglés, 'un poco' significa 'algo', mientras que 'poco' significa 'casi ninguno'.
wujek
1
Solo una duda rápida, en sus Spring AOP Pros (segundo punto), si usamos la anotación @Aspect en primavera, será aspecto J AOP, solo me pregunto, en ese caso, si usará Proxy (tiempo de ejecución) o modificación de byte (compilación hora). Porque, tengo la impresión de que AspectJ es tiempo de compilación y Spring AOP es tiempo de ejecución AOP. Ayuda por
favor
21

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

  1. Uno está relacionado con el tipo de tejido.
  2. Otro para la definición de punto de unión.

Spring-AOP: tejido en tiempo de ejecución a través del proxy utilizando el concepto dedynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: Tiempo de compilación entretejido AspectJ Java Tools(ajc compiler)si la fuente está disponible o tejido de compilación posterior (utilizando archivos compilados). Además, se puede habilitar el tejido de tiempo de carga con Spring: necesita el aspectjarchivo de definición y ofrece flexibilidad.

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

techzen
fuente
20

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

Ver los puntos de referencia .

Joseph Lust
fuente
14

Spring AOP es una de las partes esenciales del marco de primavera. En la etapa más básica, el marco de primavera 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 comprender cómo funciona AOP en Spring es que cuando escribe un Aspecto con Spring, instrumentamos el marco con la creación de un proxy para sus objetos, con un JDKDynamicProxysi su bean implementa una interfaz o mediante CGLIB si su bean no implementa interfaz. Recuerde que debe tener cglib 2.2 en su ruta de clase si está utilizando Spring antes de la versión 3.2. A partir de Spring 3.2 es inútil porque se incluyó cglib 2.2 en el núcleo.

El marco en la creación del bean creará un proxy que envuelve sus objetos y agrega responsabilidades de preocupaciones transversales como la seguridad, la gestión de transacciones, el registro, etc.

La creación de proxy de esta manera se aplicará a partir de una expresión de corte de punto que instrumente el marco para decidir qué beans y métodos se crearán como proxies. El consejo será la mayor responsabilidad que su código. Recuerde que en este proceso, el corte de puntos captura solo métodos públicos que no se declaran como finales.

Ahora, mientras que en Spring AOP el tejido de Aspects será realizado por el contenedor al inicio del contenedor, en AspectJ debe realizar esto con una compilación posterior de su código a través de la modificación de bytecode. 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 todo el poder de AOP porque la implementación se realiza a través de servidores proxy y no a través de la modificación de su código.

Como en AspectJ, puede usar el tejido de tiempo de carga en SpringAOP. Puede beneficiarse de esta característica en primavera que se implementa con un agente y configuraciones especiales, @EnabledLoadWeavingo en XML. Puede usar el espacio de nombres como ejemplo. Sin embargo, en Spring AOP no puedes interceptar todos los casos. Por ejemplo, el newcomando no es compatible con Spring AOP.

Sin embargo, en Spring AOP puede beneficiarse del uso de AspectJ mediante el uso del aspectofmétodo de fábrica en el bean de configuración de primavera.

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 beans de primavera. Mientras que con AspectJ puedes usar el aspecto en todos tus beans. Otro punto de comparación es la depuración y la previsibilidad del comportamiento del código. Con spring AOP, el trabajo se realiza todo desde el compilador de Java y los aspectos son una forma genial de crear proxy para su Spring bean. En AspectJ, si modifica el código, necesita más compilación y comprender dónde se tejen sus aspectos podría ser difícil. Incluso cerrar el tejido en primavera es más simple: con Spring elimina el aspecto de su configuración, reinicia y funciona. ¡En AspectJ debes recompilar el código!

En el tejido de 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 tiempo de carga de un aspecto que cambia el comportamiento de su nuevo operador.

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

Valerio Vaudi
fuente
0

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 depende del tejido de tiempo de carga. Esto puede fallar y, en mi experiencia, ha significado que pueden existir errores registrados pero no evitará que la aplicación se ejecute sin código de aspecto [Agregaría la advertencia de que es posible configurarlo de tal manera que no sea caso; pero yo personalmente no soy consciente de ello ]. El tejido en tiempo de compilación evita esto.

Además, si utiliza AspectJ junto con el plugin Aspectj-maven-plugin, puede ejecutar pruebas unitarias contra sus aspectos en un entorno de CI y puede confiar en que los artefactos construidos se prueban y tejen correctamente. Si bien ciertamente puede escribir pruebas unitarias controladas por Spring, todavía no tiene garantía de que el código implementado será el que se probó si falla LTW.

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

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

kcampbell
fuente
0

Este artículo también tiene una buena explicación sobre el tema.

Spring AOP y AspectJ tienen objetivos diferentes.

Spring AOP tiene como objetivo proporcionar una implementación simple de AOP en Spring IoC para resolver los problemas más comunes que enfrentan los programadores.

Por otro lado, AspectJ es la tecnología original de AOP que tiene como objetivo proporcionar una solución completa de AOP.

gce
fuente
0

En comparación con AOP, AspectJ no necesita mejorar la clase objetivo en tiempo de compilación. En su lugar, genera una clase proxy para la clase objetivo en tiempo de ejecución, que implementa la misma interfaz que la clase objetivo o es una subclase de la clase objetivo.

En resumen, una instancia de una clase proxy se puede usar como una instancia de una clase objetivo. En general, el marco AOP mejorado en tiempo de compilación es más ventajoso en rendimiento, porque el marco AOP mejorado en tiempo de ejecución requiere mejoras dinámicas cada vez que se ejecuta.

Jerry Hsu
fuente