2012-06-10 8 views
6

Quería dejarlo en claro para mí.¿Cuál es la gran idea detrás de la implementación de AOP

He leído sobre el concepto de AOP y entendí que es una gran manera de compartir servicios de corte transversal. (registro, seguridad, transacción ...)

Pero me gustaría decir/preguntar algo sobre esta idea y su implementación.

He leído que hay algunas formas, como AspectJ, JBOSS AOP para la asimilación de AOP a mi lógica de negocio.

pero no lo encontré hace mucho tiempo?

digamos, por ejemplo, quiero compartir una aplicación de registro o la seguridad amongs mis componentes (beans de Java, EJB, en absoluto ..)

Por qué no podía hacer que un grano de Singleton asegurándose de que se tiene un solo Por ejemplo, y tan pronto como un componente necesite su servicio de registro/seguridad, buscará y usará su servicio.

¿Por qué tendría que entender y tener todas esas implementaciones "grandes" como aspectj o jboss AOP? ¿Qué extraño aquí?

Respuesta

9

La idea de AOP es mantener la lógica común en un solo lugar (que también resuelve su solución Singleton) y siendo "invisible" (transparente). Con AOP su código de registro ni siquiera es parte de la lógica comercial, se "inyecta" detrás de escena.

También es más dinámico: no necesita llamar a su servicio singleton cada vez que necesita iniciar sesión. Simplemente configure un punto de corte una vez (como: "todos los adaptadores en este paquete") y se aplicará el registro para todos los códigos existentes y nuevos.

Además, AOP es mucho, mucho más flexible y potente. Puede solicitar la implementación de AOP: "inicie una transacción cada vez que llame a un método que comience por" save* "y tome un argumento" o "si el método devuelve Customer arroja una excepción de subclasificación de IllegalAgumentException, llame de nuevo a ese método".

AOP es mucho más que simplemente agrupar la lógica común.

+0

¿Qué sucede si creo una clase padre y extiendo mis clases a partir de ella? Podría poner toda mi lógica de "perment" en esa clase de padres. cuando una clase lo extienda, podrá disfrutar de todos los métodos loggig/secutiry ... que habría declarado antes. También puedo crear métodos adicionales "crear"/"destruir" para Perment Loggig y tales ... – rayman

+0

@rayman: pero igual debe ** llamar ** a estos métodos explícitamente (vea la gran muestra de código * JB Nizet *). AOP lo hará por usted una vez instruido, ¡también por el código que aún no ha escrito! Esto también significa que los nuevos programadores disfrutarán de las funciones de registro/seguridad sin siquiera saber de ellos.Sin mencionar que no estás abarrotando tu código con clases base/métodos de ayuda –

+0

Mybe, puedes consultar mi último comentario en JB. – rayman

6

No ha entendido de qué se trata AOP. La idea de AOP es ser capaz de escribir

public void foo() { 
    // some business code 
} 

en lugar de escribir

public void foo() { 
    LogManager.getInstance().log("entering foo..."); 
    SecurityManager.getInstance().checkUserInRole("fooer"); 
    TransactionManager.getInstance().startTransaction(); 
    try { 
     // some business code 
     TransactionManager.getInstance().commit(); 
    } 
    catch(RuntimeException e) { 
     TransactionManager.getInstance().rollback(); 
     throw e; 
    } 
    LogManager.getInstance().log("leaving foo..."); 
} 

Todos los temas transversales (tala, la seguridad, la gestión de transacciones) se encuentran fuera del código de negocio, en lugar de mezclándose con el código comercial, y repetido ad nauseam.

+0

Pero aún necesita decirle a la lógica AOP cuándo/dónde desea usar esos servicios ... ¿cómo sabrá que quiero registrar la entrada/salida de un método? o si solo quiero iniciar sesión.bug algo en el medio de mi método ... alguien1 necesita decirle que lo haga. no puede leer mi mente. – rayman

+0

Esto normalmente se hace declarativamente, en un archivo de configuración o usando anotaciones Java. Por ejemplo, Spring permite marcar un método con '@ Transactional'. También permite configurar un interceptor AOP para que todos los métodos de todos los beans cuyo nombre de clase finalice con 'ServiceImpl' sea transaccional (esto es solo un ejemplo). Si necesita registrar algo en medio de su método, AOP no lo ayudará. –

+0

Así que vamos a usarlo solo para el registro/seguridad ... ¿no es un poco exagerado solo por eso? ¿Hay más soluciones que podría utilizar AOP para al lado de las 3 que mencionas antes? – rayman

Cuestiones relacionadas