2009-05-20 14 views
8

Quando si utilizza AspectJ, perché utilizzare @Component su @Configurable.Configurable vs Component with Spring and AspectJ

Ho installato Spring e AspectJ per il supporto @Transactional, aspetti sull'invocazione automatica e l'iniezione in entità JPA. Funziona alla grande

Sto usando @Component per la maggior parte delle classi che necessitano di iniezione, e quindi le ho iniettate nelle loro dipendenze. Oppure, quando non riesco, iniettare ApplicationContext e quindi utilizzare getBean() come ultima risorsa. E riservo @Configurable solo alle entità JPA (Hibernate) che necessitano di iniezione. Ho anche iniziato a usare @Configurable per i test di jUnit, per rendere facili i test di scrittura. Anche questo funziona alla grande.

Ma sono curioso. Se AspectJ è ora auto-injecting (beanifying) di qualsiasi cosa con l'annotazione @Configurable, indipendentemente da come è stato costruito; getBean(), new(), @Autowired. Perché non dovrei semplicemente usare @Configurable per tutti i miei bean? Quindi posso eliminare del tutto il contesto dell'applicazione e getBean(), e solo new() qualsiasi classe che non posso iniettare.

Mi rendo conto che non ho fatto menzione della configurazione del bean XML. Non me ne lascio indietro, ma a questo progetto non è richiesto alcuno. Il costruttore o setter mi inietta le dipendenze durante il test. molto facile.

risposta

1

Un motivo per cui non si dovrebbe sempre usare @Configurable è che aggiunge un sacco di spese generali: spesso l'avvio della app richiede molto più tempo e la creazione di nuove istanze diventa più lenta.

Per @Component non è necessario, perché normalmente tutte le istanze sono gestite da Spring.

12

@Component è un'interfaccia di marker Spring che può dare indizi di primavera quando si tratta di rilevamento automatico dei bean.

@Configurable è un indicatore utilizzato dal materiale di tessitura a tempo di caricamento AOP.

I due non hanno molto molto a che fare l'uno con l'altro.

6

@Component è per le classi che verranno istanziate da Spring stessa, mentre @Configurable è per le classi che verranno istanziate dal proprio codice, o da un altro framework - entità da Hibernate o Servlet dal contenitore servlet, per esempio.