Per molto tempo ho creduto che ci fosse un valore nell'avere una "configurazione centralizzata, dichiarativa" come i file xml che tutti usavamo. Poi mi sono reso conto che la maggior parte delle cose nei file non erano di configurazione : non sono mai state modificate da nessuna parte dopo lo sviluppo. Poi ho capito che "centralizzato" ha valore solo in sistemi piuttosto piccoli - solo in sistemi piccoli sarai mai in grado di eseguire il grok di un file di configurazione nel suo insieme . E qual è davvero il valore della comprensione del cablaggio nel suo insieme, quando gli stessi "cablaggi" sono per lo più duplicati dalle dipendenze nel codice? Quindi l'unica cosa che ho tenuto sono i metadati (annotazioni), che è ancora un po 'dichiarativo. Questi non cambiano mai in fase di esecuzione e non lo sono mai dati di "configurazione" che qualcuno cambierà al volo - quindi penso che tenerli nel codice sia bello.
Uso il cablaggio automatico completo il più possibile. Lo adoro. Non tornerò alla primavera vecchio stile se non minacciato di sparare. Le mie ragioni per preferire completamente @Autowired
sono cambiate nel tempo.
In questo momento penso che il motivo più importante per l'utilizzo dell'autowiring sia che nel tuo sistema c'è un'astrazione in meno di cui tenere traccia. Il "nome bean" è effettivamente sparito. Si scopre che il nome del bean esiste solo a causa di xml. Quindi un intero strato di riferimenti indiretti astratti (dove si collegherebbe il nome "foo" del bean in "barra" del bean) è sparito. Ora installo direttamente l'interfaccia "Foo" nel mio bean e l'implementazione viene scelta dal profilo di runtime. Questo mi consente di lavorare con il codice quando si tracciano dipendenze e implementazioni. Quando vedo una dipendenza autowired nel mio codice, posso semplicemente premere il tasto "vai all'implementazione" nel mio IDE e compare l'elenco delle implementazioni conosciute. Nella maggior parte dei casi c'è solo un'implementazione e vado subito in classe. Può' quale implementazione viene utilizzata (sostengo che il contrario è più vicino alla verità con il cablaggio xml - divertente come cambia la tua prospettiva!)
Ora potresti dire che è solo un livello molto semplice, ma ogni livello di astrazione che aggiungiamo ai nostri sistemi aumenta la complessità. Non credo davvero che l'xml abbia mai aggiunto alcun valore reale a qualsiasi sistema con cui ho lavorato.
La maggior parte dei sistemi con cui ho mai lavorato ha una sola configurazione dell'ambiente di runtime di produzione. Potrebbero esserci altre configurazioni per il test e così via.
Direi che il pieno autowiring è il rubino su rotaie della primavera: abbraccia l'idea che esiste un modello di utilizzo normale e comune che la maggior parte dei casi d'uso segue. Con la configurazione XML, si consente un utilizzo della configurazione coerente / incoerente che potrebbe / potrebbe non essere previsto. Ho visto così tanta configurazione xml esagerare con incoerenze: viene refactored insieme al codice? Non ho pensato. Quelle variazioni ci sono per una ragione? Di solito no.
Difficilmente usiamo qualificatori nella nostra configurazione e abbiamo trovato altri modi per risolvere queste situazioni. Questo è un chiaro "svantaggio" che incontriamo: abbiamo leggermente modificato il modo in cui codifichiamo per renderlo più fluido con l'autowiring: un repository dei clienti non implementa più l' Repository<Customer>
interfaccia generica ma creiamo un'interfaccia CustomerRepository
che si estende Repository<Customer>
. A volte c'è anche un trucco o due quando si tratta di sottoclasse. Ma di solito ci indica semplicemente la direzione di una digitazione più forte, che trovo quasi sempre una soluzione migliore.
Ma sì, stai legando a un particolare stile di DI che principalmente fa primavera. Non creiamo più setter pubblici per le dipendenze (quindi potresti obiettare che siamo +1 nel dipartimento di incapsulamento / occultamento delle informazioni) Abbiamo ancora alcuni xml nel nostro sistema, ma l'xml contiene sostanzialmente solo le anomalie. Il completo autowiring si integra perfettamente con XML.
L'unica cosa di cui abbiamo bisogno ora è che @Component
, @Autowired
e il resto sia incluso in una JSR (come JSR-250 ), quindi non dobbiamo legarci con la primavera. Questo è il modo in cui le cose sono java.util.concurrent
successe in passato (le cose mi vengono in mente), quindi non sarei completamente sorpreso se ciò accadesse di nuovo.