Differenza tra vs

1. Panoramica

In questo tutorial, impareremo le differenze tra i due principali elementi di configurazione XML di Spring: e .

2. Definizioni di fagioli

Come tutti sappiamo, Spring ci fornisce due modi per definire i nostri bean e dipendenze: configurazione XML e annotazioni Java. Possiamo anche classificare le annotazioni di Spring in due gruppi: annotazioni di inserimento delle dipendenze e annotazioni di bean.

Prima delle annotazioni, dovevamo definire manualmente tutti i nostri bean e dipendenze nei file di configurazione XML. Ora, grazie alle annotazioni di Spring, può scoprire e collegare automaticamente tutti i nostri bean e dipendenze per noi . Quindi, possiamo almeno eliminare l'XML necessario per i bean e le dipendenze.

Tuttavia, dobbiamo ricordare che le annotazioni sono inutili a meno che non le attiviamo . Per attivarli, possiamo aggiungere entrambi o sopra il nostro file XML.

In questa sezione vedremo come e differiscono tra loro in termini di modalità di attivazione delle annotazioni.

3. Attivazione dell'annotazione da < context: annotation-config>

Il l'annotazione viene utilizzata principalmente per attivare le annotazioni di inserimento delle dipendenze. @Autowired , @Qualifier , @PostConstruct , @PreDestroy e @Resource sono alcuni di quelli chepuò risolvere.

Facciamo un semplice esempio per vedere come può semplificare la configurazione XML per noi.

Per prima cosa, creiamo una classe con un campo di dipendenza:

public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}

Ora definiamo i nostri fagioli.

Prima di andare oltre, facciamo notare che abbiamo ancora bisogno di dichiarare i bean nell'XML. Questo perchèattiva le annotazioni solo per i bean già registrati nel contesto dell'applicazione .

Come si può vedere qui, abbiamo annotato l'AccountService campo utilizzando @Autowired . @Autowired dice a Spring che questo campo è una dipendenza che deve essere automaticamente cablata da un bean corrispondente.

Se non usassimo @Autowired , avremmo bisogno di impostare manualmente la dipendenza accountService :

Ora possiamo fare riferimento ai nostri bean e dipendenze in uno unit test:

@Test public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml"); UserService userService = context.getBean(UserService.class); AccountService accountService = context.getBean(AccountService.class); Assert.assertNotNull(userService); Assert.assertNotNull(accountService); Assert.assertNotNull(userService.getAccountService()); }

Hmm, qualcosa non va qui. Sembra che Spring non stia collegando accountService anche se l'abbiamo annotato da @Autowired . Sembra che @Autowired non sia attivo. Per risolvere questo problema, aggiungeremo semplicemente la seguente riga sopra il nostro file XML:

4. Attivazione dell'annotazione da < context: component-scan>

Come simile a , può riconoscere ed elaborare anche le annotazioni di inserimento delle dipendenze. Inoltre, riconosce le annotazioni dei bean che non rileva .

Fondamentalmente, rileva le annotazioni tramite la scansione del pacchetto . Per dirla diversamente, dice a Spring quali pacchetti devono essere scansionati per cercare i bean oi componenti annotati.

@Component , @Repository , @Service , @Controller , @RestController e @Configuration sono diversi chepuò rilevare .

Vediamo ora come possiamo semplificare il nostro esempio precedente:

@Component public class UserService { @Autowired private AccountService accountService; } 
@Component public class AccountService {}

Qui, l' annotazione @Component contrassegna le nostre classi come bean . Ora possiamo pulire tutte le definizioni dei bean dal nostro file XML. E, naturalmente, dobbiamo mantenere il file sopra:

Infine, notiamo che Spring cercherà i bean annotati e le dipendenze sotto il pacchetto indicato dall'attributo base-package .

5. conclusione

In questo tutorial, abbiamo esaminato le differenze tra e .

Gli esempi di codice, come sempre, sono finiti su GitHub.