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?
java
spring
design-patterns
aspectj
spring-aop
babydudecoder
fuente
fuente
Respuestas:
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
AspectJ Pros
AspectJ Contras
fuente
If you need to advise objects not managed by the Spring container (such as domain objects typically), then you will need to use AspectJ.
Además de lo que otros han dicho, solo para reformular
there are two major differences
:Spring-AOP: tejido en tiempo de ejecución a través del proxy utilizando el concepto de
dynamic 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 elaspectj
archivo 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.
fuente
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 .
fuente
El manual del usuario de primavera le dará mucha información, directamente de la boca del caballo.
El capítulo 6.4: la elección del estilo de declaración de AOP que debe utilizar es muy acertado para usted, ya que analiza los pros y los contras de ambos.
El párrafo 6.1.2 - Capacidades y objetivos de Spring AOP y capítulos 6.2 - Soporte @Aspect y 6.8 - Usar AspectJ con aplicaciones Spring debería ser particularmente interesante.
fuente
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 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
JDKDynamicProxy
si 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,
@EnabledLoadWeaving
o en XML. Puede usar el espacio de nombres como ejemplo. Sin embargo, en Spring AOP no puedes interceptar todos los casos. Por ejemplo, elnew
comando no es compatible con Spring AOP.Sin embargo, en Spring AOP puede beneficiarse del uso de AspectJ mediante el uso del
aspectof
mé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
fuente
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.
fuente
Este artículo también tiene una buena explicación sobre el tema.
fuente
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.
fuente