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 JDKDynamicProxy
se 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, @EnabledLoadWeaving
o in XML. Puoi usare lo spazio dei nomi come esempio. Tuttavia, in Spring AOP non è possibile intercettare tutti i casi. Ad esempio, il new
comando non è supportato in Spring AOP.
Tuttavia, in Spring AOP è possibile trarre vantaggio dall'uso di AspectJ attraverso l'uso del aspectof
metodo 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