2012-06-10 15 views
6

Volevo che fosse chiaro per me.Qual è la grande idea dietro l'implementazione AOP

Ho letto del concetto AOP e ho capito che è un ottimo modo per condividere i servizi di taglio trasversale. (Logging, la sicurezza, transazioni ...)

Ma vorrei dire/chiedere qualcosa su questa idea e la sua implementazione.

ho letto ci sono alcuni modi come AspectJ, JBoss AOP al fine di assimilazione AOP alla mia logica di business.

ma non era qui già tanto tempo fa?

diciamo per esempio che voglio condividere un'implementazione di registrazione o di sicurezza amongs miei componenti (fagioli Java, EJB, di sorta ..)

Perché non potevo fare un fagiolo Singleton assicurandosi che Will ha un solo istanza e non appena ogni componente avrà bisogno del suo servizio di registrazione/sicurezza, cercherebbe di cercarlo e usarlo.

Perché avrei bisogno di capire e di avere tutte quelle implementazioni "Big" come aspectj o JBoss AOP? Cosa mi manca qui?

risposta

9

L'idea di AOP è di mantenere la logica comune in un unico punto (che risolve anche la soluzione single) e "invisibile" (trasparente). Con AOP il tuo codice di registrazione non è nemmeno parte della logica aziendale, è "iniettato" dietro le quinte.

Inoltre, è più dinamico: non è necessario chiamare il servizio di singleton ogni volta che è necessario registrarsi. Basta configurare un collegamento di punti una volta (come: "tutti i setter in questo pacchetto") e la registrazione verrà applicata per tutto il codice esistente e nuovo.

Inoltre AOP è molto, molto più flessibile e potente. Si può chiedere l'attuazione AOP: "si prega di avviare una transazione ogni volta che io chiamo un metodo che inizia con" save* "e prendendo un argomento" o "se il metodo di ritorno Customer genera un'eccezione sottoclassi da IllegalAgumentException, richiamare ancora una volta che il metodo".

AOP è molto più che un semplice raggruppamento di logica comune.

+0

Cosa succede se creo classe genitore ed estendo le mie classi si estendono da esso. Potrei mettere tutta la mia logica "perment" in quella classe genitore. quando una classe lo estenderà, sarà in grado di godere di tutti i metodi logging/secutiry ... che avrei dichiarato prima. Posso anche creare metodi aggiuntivi "crea"/"distruggi" per il registro perment e così via. – rayman

+0

@rayman: ma devi comunque ** chiamare ** questi metodi in modo esplicito (vedi esempio di codice ottimo * JB Nizet *). AOP lo farà per te una volta istruito, anche per il codice che non hai ancora scritto! Ciò significa anche che i nuovi programmatori godranno di funzionalità di registrazione/sicurezza senza nemmeno conoscerle.Per non parlare del fatto che non stai ingombrando il tuo codice con le classi base/metodi di supporto –

+0

Mybe puoi controllare il mio ultimo commento a JB. – rayman

6

Non hai capito che cos'è AOP. L'idea di AOP è quella di essere in grado di scrivere

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

invece di scrivere

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..."); 
} 

Tutte le preoccupazioni trasversali (logging, di sicurezza, di gestione delle transazioni) sono al di fuori del codice di business, invece di essere mescolato con il codice aziendale e ripetuto fino alla nausea.

+0

Ma è ancora necessario indicare la logica AOP quando/dove si desidera utilizzare tali servizi. Come saprà che desidero registrare la voce/l'uscita di un metodo? o se voglio solo loggare qualcosa di log.debug nel mezzo del mio metodo .. qualcuno deve dirlo per farlo. Non posso leggere la mia mente .. – rayman

+0

Questo è tipicamente fatto in modo dichiarativo, in un file di configurazione o usando annotazioni Java. Ad esempio, Spring consente di contrassegnare un metodo con '@ Transactional'. Consente inoltre di configurare un intercettore AOP per creare tutti i metodi di tutti i bean il cui nome di classe termina con transactional 'ServiceImpl' (questo è solo un esempio). Se devi registrare qualcosa nel mezzo del tuo metodo, allora AOP non ti aiuterà. –

+0

Quindi lo useremo per la registrazione/sicurezza solo .. non è un po 'eccessivo solo per quello? ci sono più soluzioni che potrei usare AOP per i 3 che hai menzionato prima? – rayman

Problemi correlati