Pregunta

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.

¿Puede alguien resaltar los diversos pros y contras de usar Spring AOP vs AspectJ en una aplicación Spring?

¿Fue útil?

Solución

Spring-AOP Pros

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

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

Contras Spring-AOP

  • Este es un AOP basado en proxy, por lo que básicamente solo puedes 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 una pequeña sobrecarga en tiempo de ejecución.
  • 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 en tiempo de ejecución que la de Spring AOP.

AspectJ Contras

  • Ten cuidado. Verifique si sus aspectos están entretejidos solo con lo que deseaba tejer.
  • Necesita un proceso de compilación adicional con AspectJ Compiler o tiene que configurar LTW (tiempo de carga)

Otros consejos

Aparte de lo que otros han dicho, solo para reformular, hay dos diferencias principales :

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

Spring-AOP: El tiempo de ejecución se entreteje a través del proxy utilizando el concepto de proxy dinámico si existe una interfaz o la biblioteca cglib si se proporciona la implementación directa.

AspectJ: Recopilación de tiempo de compilación a través de AspectJ Java Tools (compilador de ajc) si la fuente está disponible o después de tejer la compilación (usando archivos compilados). Además, se puede habilitar el tiempo de carga con Spring, ya que necesita el archivo de definición aspectj y ofrece flexibilidad.

El tiempo de compilación puede ofrecer beneficios de rendimiento (en algunos casos) y también la definición de joinpoint en Spring-aop está restringida solo a la definición de método, que no es el caso de AspectJ.

El manual de usuario de primavera dará mucho más De información, directamente de la boca del caballo.

El capítulo 6.4 - Elegir qué declaración de AOP el estilo de uso está para usted, ya que analiza los pros y los contras de ambos.

El párrafo 6.1. 2 - Capacidad y objetivos del AOP de primavera & amp; capítulos 6.2 - @Aspect support y 6.8 - Uso de AspectJ con aplicaciones Spring debería ser particularmente interesante.

Una nota adicional: Si el rendimiento con carga alta es importante, querrás AspectJ, que es 9-35 veces más rápido que Spring AOP . Puede que 10ns vs 355ns no parezca mucho, pero he visto a personas usando LOTS of Aspects. 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.

Consulte benchmarks .

Spring AOP es una de las partes esenciales del marco de resorte. En la etapa muy básica, el marco de primavera se basa en IoC y AOP. En el curso oficial de primavera 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 escribes un Aspect con Spring, instrumentamos el marco con un proxy para tus objetos, con un JDKDynamicProxy si tu bean implementa una interfaz. o vía CGLIB si su bean no implementa ninguna interfaz. Recuerde que debe tener cglib 2.2 en su ruta de clase si está usando Spring antes de la versión 3.2. A partir de la primavera 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 envuelve sus objetos y agrega responsabilidades transversales relacionadas con 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 instruye al marco para decidir qué beans y métodos se crearán como proxies. El consejo será más responsabilidad que por tu código. Recuerde que en este proceso, el punto de corte captura solo los métodos públicos que no se declaran como definitivos.

Ahora, mientras que en Spring AOP, el contenedor de Aspectos 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 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 otra parte, con Spring AOP no puedes usar todo el poder de AOP porque la implementación se realiza a través de proxies y no con la modificación de tu código.

Al igual que en AspectJ, puede utilizar el tejido de tiempo de carga en SpringAOP. Usted puede beneficiarse de esta característica que en primavera se implementa con un agente y configuraciones especiales, @EnabledLoadWeaving o en XML. Puedes usar el espacio de nombres como ejemplo. Sin embargo, en Spring AOP no puedes interceptar todos los casos. Por ejemplo, el comando new no se admite en Spring AOP.

Sin embargo, en Spring AOP puede beneficiarse del uso de AspectJ mediante el uso del método de fábrica aspectof 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 spring beans. 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 Spring AOP, el trabajo se realiza todo desde el compilador de Java y los aspectos son una forma excelente de crear un proxy para su Spring Bean. En AspectJ, si modifica el código, necesita más compilación y entender dónde se tejen sus aspectos podría ser difícil. Incluso apagar el tejido en primavera es más sencillo: con la primavera, elimina el aspecto de su configuración, reinicie 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

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

Además, si usa AspectJ junto con aspectj-maven-plugin, entonces puede ejecutar pruebas unitarias en relación con sus aspectos en un entorno de CI y confía en que los artefactos construidos se prueben y se tejan correctamente. Si bien ciertamente puede escribir pruebas de unidad impulsadas por Spring, todavía no tiene garantía de que el código implementado será el que se probó si el LTW falla.

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

Hace cinco años, estaba mucho más a favor de Spring AOP configurado 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 capacidad de cálculo y la memoria disponible han aumentado, esto se ha convertido en un problema mucho menor y CTW con el plugin aspectj-maven se ha convertido en una mejor opción en mi entorno de trabajo en función de los motivos que he descrito anteriormente.

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 AOP simple a lo largo de 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 apunta a   proporcionar una solución AOP completa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top