Spring AOP vs AspectJ


178

Ho l'impressione che Spring AOP sia usato al meglio per attività specifiche dell'applicazione come sicurezza, registrazione, transazioni, ecc. Poiché utilizza le annotazioni Java5 personalizzate come framework. Tuttavia, AspectJ sembra essere più amichevole nei modelli di progettazione.

Qualcuno può evidenziare i vari pro e contro dell'utilizzo di Spring AOP vs AspectJ in un'applicazione Spring?


3
Quando alcune annotazioni esistono in primavera ma esistono anche in Java, cosa dovresti usare? Giava. La stessa logica si applica a questa funzionalità. La primavera è primavera qui oggi è andato domani. (I Remeber hanno usato Struts un po 'prima della primavera). AspectJ è la soluzione preferita a lungo termine. Durerà la primavera. Non sto congedando Spring, sto solo dicendo, per questo aspetto ...: -;
ino

Risposte:


236

Pro primavera-AOP

  • È più semplice da usare rispetto ad AspectJ, dal momento che non è necessario utilizzare LTW ( load-time weaving ) o il compilatore AspectJ.

  • Utilizza il modello Proxy e il modello Decorator

Cons. Spring-AOP

  • Si tratta di AOP basato su proxy, quindi in pratica è possibile utilizzare solo joinpoint di esecuzione del metodo.
  • Gli aspetti non vengono applicati quando si chiama un altro metodo all'interno della stessa classe.
  • Ci può essere un piccolo sovraccarico di runtime.
  • Spring-AOP non può aggiungere un aspetto a tutto ciò che non è stato creato dalla fabbrica Spring

AspectJ Pro

  • Questo supporta tutti i joinpoint. Questo significa che puoi fare qualsiasi cosa.
  • Il sovraccarico di runtime è inferiore a quello di Spring AOP.

Aspetto Contro

  • Stai attento. Controlla se i tuoi aspetti sono intrecciati solo a ciò che volevi essere tessuto.
  • È necessario un ulteriore processo di compilazione con AspectJ Compiler o è necessario impostare LTW (tessitura a tempo di caricamento)

20
@Configurable richiede l'uso di AspecJ tramite Spring. Dai documenti: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

7
un altro truffatore di primavera per me sono le lunghe stacktraces illeggibili a causa dell'approccio basato sul proxy
wrm

1
Parte confusa nella risposta: com'è avere un piccolo runtime overhead un pro per uno strumento e la possibilità di avere un po 'di runtime overhead un contro per l'altro?
Moreaki,

16
@Moreaki: Ha detto 'un po' di spese generali 'come truffatore e' un po 'di spese generali' come un professionista. La sola differenza "a" è molto importante: in inglese, "un po '" significa "un po'", mentre "piccolo" significa "quasi nessuno".
wujek,

1
Solo un breve dubbio - nei tuoi Spring AOP Pro (2 ° punto) - se usiamo l'annotazione @Aspect in primavera, sarà aspetto J AOP, solo chiedendomi, in quel caso se utilizzerà Proxy (tempo di esecuzione) o modifica byte (compilare tempo). Perché, ho l'impressione che AspectJ sia tempo di compilazione e Spring AOP sia tempo di esecuzione AOP. Pls help
Pedantic

21

A parte ciò che altri hanno affermato - solo per riformulare there are two major differences:

  1. Uno è legato al tipo di tessitura.
  2. Un altro alla definizione del joinpoint.

Spring-AOP: runtime che passa attraverso il proxy usando il concetto didynamic proxy if interface exists or cglib library if direct implementation provided.

AspectJ: compilazione del tempo di compilazione AspectJ Java Tools(ajc compiler)se disponibile sorgente o tessitura post compilation (utilizzando file compilati). Inoltre, è possibile abilitare la tessitura dei tempi di caricamento con Spring: richiede il aspectjfile di definizione e offre flessibilità.

La tessitura a tempo di compilazione può offrire vantaggi in termini di prestazioni (in alcuni casi) e anche di joinpoint definition in Spring-aop is restricted to method definition only which is not the case for AspectJ.




14

Spring AOP è una delle parti essenziali del framework di primavera. Nella fase molto semplice, il framework di primavera si basa su IoC e AOP. Nel corso ufficiale della primavera c'è una diapositiva in cui si dice:

L'AOP è una delle parti più importanti del quadro.

Il punto chiave per capire come funziona AOP in Spring è che quando scriviamo un Aspetto con Spring, strumentiamo il framework con la creazione di un proxy per i vostri oggetti, con un JDKDynamicProxyse il vostro bean implementa un'interfaccia o tramite CGLIB se il vostro bean non implementa alcun interfaccia. Ricorda che devi avere cglib 2.2 nel tuo percorso di classe se stai usando Spring prima della versione 3.2. A partire dalla primavera 3.2 è inutile perché cglib 2.2 è stato incluso nel core.

Il framework alla creazione del bean creerà un proxy che avvolge i tuoi oggetti e aggiunge responsabilità trasversali quali sicurezza, gestione delle transazioni, registrazione e così via.

La creazione del proxy in questo modo verrà applicata a partire da un'espressione pointcut che strumenti il ​​framework per decidere quali bean e metodi verranno creati come proxy. Il consiglio sarà più responsabile rispetto al tuo codice. Ricorda che in questo processo il pointcut acquisisce solo metodi pubblici che non sono dichiarati come finali.

Ora, mentre in Spring AOP la tessitura di Aspects sarà eseguita dal container all'avvio del container, in AspectJ devi farlo con una compilazione post del tuo codice attraverso la modifica bytecode. Per questo motivo, a mio avviso, l'approccio Spring è più semplice e più gestibile di AspectJ.

D'altra parte, con Spring AOP non puoi sfruttare tutta la potenza di AOP perché l'implementazione avviene tramite proxy e non con la modifica del codice.

Come in AspectJ, è possibile utilizzare la tessitura a tempo di caricamento in SpringAOP. Puoi beneficiare di questa funzione in primavera implementata con un agente e configurazioni speciali, @EnabledLoadWeavingo in XML. Puoi usare lo spazio dei nomi come esempio. Tuttavia, in Spring AOP non è possibile intercettare tutti i casi. Ad esempio, il newcomando non è supportato in Spring AOP.

Tuttavia, in Spring AOP è possibile trarre vantaggio dall'uso di AspectJ attraverso l'uso del aspectofmetodo factory nel bean di configurazione spring.

Poiché Spring AOP è fondamentalmente un proxy creato dal contenitore, quindi è possibile utilizzare AOP solo per i bean di primavera. Mentre con AspectJ puoi usare l'aspetto in tutti i tuoi bean. Un altro punto di confronto è il debug e la prevedibilità del comportamento del codice. Con Spring AOP, il lavoro è preformato tutto dal compilatore Java e gli aspetti sono un modo molto interessante per creare proxy per il tuo bean Spring. In AspectJ se modifichi il codice, hai bisogno di più compilazioni e capire dove sono intessuti i tuoi aspetti potrebbe essere difficile. Anche arrestare la tessitura in primavera è più semplice: con la molla rimuovi l'aspetto dalla tua configurazione, riavvia e funziona. In AspectJ devi ricompilare il codice!

Nella tessitura a tempo di caricamento, AspectJ è più flessibile di Spring perché Spring non supporta tutte le opzioni di AspectJ. Ma secondo me Se vuoi cambiare il processo di creazione di un bean, un modo migliore è gestire il login personalizzato in una fabbrica e non con la tessitura a tempo di caricamento di un aspetto che cambia il comportamento del tuo nuovo operatore.

Spero che questa panoramica di AspectJ e Spring AOP ti aiuti a capire la differenza delle due pozioni


0

È importante considerare se i tuoi aspetti saranno mission-critical e dove verrà distribuito il tuo codice. Spring AOP significherà che ti affidi alla tessitura a tempo di caricamento. Questo può non riuscire a tessere e nella mia esperienza ha significato che potrebbero esistere errori registrati ma non impedirà l'esecuzione dell'applicazione senza codice di aspetto [Aggiungerei l'avvertenza che potrebbe essere possibile configurarlo in modo che questo non sia il Astuccio; ma non ne sono personalmente consapevole ]. La tessitura in fase di compilazione evita questo.

Inoltre, se si utilizza AspectJ insieme al plug-in aspectj-maven, si è in grado di eseguire test unitari sui propri aspetti in un ambiente CI e si ha la certezza che gli artefatti creati siano testati e tessuti correttamente. Sebbene sia possibile scrivere test di unità basati su Spring, non si ha ancora alcuna garanzia che il codice distribuito sarà quello che è stato testato in caso di errore LTW.

Un'altra considerazione è se stai ospitando l'applicazione in un ambiente in cui sei in grado di monitorare direttamente il successo o il fallimento di un server / avvio di un'applicazione o se la tua applicazione viene distribuita in un ambiente in cui non è sotto la tua supervisione [es. Dove è ospitato da un client]. Ancora una volta, questo indicherebbe la strada per compilare la tessitura del tempo.

Cinque anni fa, ero molto più a favore di AOP configurato Spring per il semplice motivo che era più facile lavorare con me e meno probabilità di masticare il mio IDE. Tuttavia, con l'aumentare della potenza di calcolo e della memoria disponibile, questo è diventato molto meno un problema e CTW con il plug-in aspectj-maven è diventata una scelta migliore nel mio ambiente di lavoro in base ai motivi che ho descritto sopra.


0

Questo articolo ha anche una buona spiegazione per quanto riguarda l'argomento.

Spring AOP e AspectJ hanno obiettivi diversi.

Spring AOP mira a fornire una semplice implementazione AOP in Spring IoC per risolvere i problemi più comuni che i programmatori devono affrontare.

D'altro canto, AspectJ è la tecnologia AOP originale che mira a fornire una soluzione AOP completa.


0

Rispetto ad AOP, AspectJ non ha bisogno di migliorare la classe target al momento della compilazione. Al contrario, genera una classe proxy per la classe di destinazione in fase di runtime, che implementa la stessa interfaccia della classe di destinazione o è una sottoclasse della classe di destinazione.

In breve, un'istanza di una classe proxy può essere utilizzata come istanza di una classe di destinazione. In generale, il framework AOP avanzato in fase di compilazione è più vantaggioso in termini di prestazioni, poiché il framework AOP avanzato in fase di runtime richiede miglioramenti dinamici ogni volta che viene eseguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.