2014-12-20 18 views
6

Il servizio chiama chiamate classe Dao su cui è necessario applicare l'aspetto di registrazione (annotativo). Mi chiedo in che modo gli aspetti di vengano effettivamente applicati.In che modo gli aspetti Spring funzionano internamente?

Come da mia conoscenza al momento dell'iniezione DAO in Oggetto servizio, la molla rileva che esiste un aspetto (in questo caso la registrazione) è configurato per DAO, quindi inietta l'oggetto proxy anziché l'oggetto obiettivo effettivo. Ora, quando viene effettuata una chiamata effettiva a qualsiasi metodo all'interno di DAO, il proxy applica gli aspetti e quindi chiama l'oggetto target effettivo . È corretto ? Anche io credo che questo si chiami Run time weaving.

D'altra parte lo stesso può essere fatto con la tessitura del tempo di caricamento (con configurazione javaagent) dove la manipolazione del codice byte viene eseguita per le classi su cui è necessario applicare gli aspetti. Quindi il proxy non entra in immagine qui.

Si prega di correggere me se ho torto in quanto questo è il fondamento per tutti i moduli molla?

risposta

5

La tua comprensione è giusta. Spring AOP è basato su proxy. Spring usa entrambi i proxy JDK (preferibile anche quando il target proxy implementa almeno un'interfaccia) oi proxy CGLIB (se l'oggetto target non implementa alcuna interfaccia) per creare il proxy per un determinato bean di destinazione.

A meno che configurato per fare diversamente, Spring AOP esegue la tessitura in fase di esecuzione. Puoi comunque impostare Spring per eseguire la tessitura in tempo di caricamento attraverso AspectJ. Controlla lo documentation link per maggiori dettagli.

di riferimento per Spring AOP proxying internals

+0

Credo che il tempo di caricamento della tessitura sia migliore in termini di prestazioni poiché non ci sarebbe un sovraccarico delle prestazioni nel decidere se il proxy debba essere iniettato in base alla configurazione dell'aspetto, come nel caso dell'intreccio del tempo di esecuzione. Sì, in tempo di caricamento, l'avvio del server di tessitura richiederà un po 'più di tempo, ma va bene come attività una tantum –

+0

Le prestazioni potrebbero essere migliori in termini di tempo di caricamento (o più precisamente di tessitura a tempo di compilazione). Migliore sarebbe verificare attraverso un test di carico) ma ci sono altre aree che potresti voler considerare come le modifiche nel sistema di build.Avresti incluso questo passaggio prima che i tuoi artefatti vengano generati. –

+1

Solo una citazione utile - "* Tutti i problemi nell'informatica possono essere risolti con un altro livello di riferimento indiretto, tranne ovviamente per il problema di troppe indirette. *" - David Wheeler – smwikipedia

1

ancora ci sono due punti da chiarire qui

Primo uno nel mio post è in realtà caricare il tempo tessendo non correre il tempo tessendo

Da questo link

carico -time weaving (LTW) è semplicemente una trasmissione binaria differita fino al punto che un programma di caricamento classe carica un file di classe e definisce la classe al JVM. Per supportare questo, sono necessari uno o più "caricatori di classi di tessitura", forniti esplicitamente dall'ambiente di runtime o abilitati tramite un "agente di tessitura".

secondo è tempo di compilazione tessitura

fase di compilazione tessendo è l'approccio più semplice. Quando si ha il codice sorgente per un'applicazione, ajc si compilerà dal sorgente e produrrà file di classe tessuta come output. L'invocazione di weaver è parte integrante del processo di compilazione ajc. Gli aspetti stessi possono essere in forma sorgente o binaria. Se sono necessari gli aspetti per la compilazione delle classi interessate, è necessario tessere in fase di compilazione. Sono richiesti aspetti, ad esempio, quando aggiungono membri a una classe e altre classi in fase di compilazione fanno riferimento ai membri aggiunti.

Problemi correlati