Unterschied zwischen vs.

1. Übersicht

In diesem Tutorial lernen wir die Unterschiede zwischen zwei wichtigen XML-Konfigurationselementen von Spring kennen: und .

2. Bohnendefinitionen

Wie wir alle wissen, bietet Spring uns zwei Möglichkeiten, unsere Beans und Abhängigkeiten zu definieren: XML-Konfiguration und Java-Annotationen. Wir können die Annotationen von Spring auch in zwei Gruppen einteilen: Annotationen zur Abhängigkeitsinjektion und Annotationen zu Beans.

Vor den Anmerkungen mussten wir alle unsere Beans und Abhängigkeiten manuell in XML-Konfigurationsdateien definieren. Dank der Anmerkungen von Spring können nun alle unsere Beans und Abhängigkeiten automatisch erkannt und für uns verkabelt werden . So können wir zumindest das für Beans und Abhängigkeiten erforderliche XML eliminieren.

Wir sollten uns jedoch daran erinnern, dass Anmerkungen nutzlos sind, wenn wir sie nicht aktivieren . Um sie zu aktivieren, können wir entweder hinzufügen oder über unserer XML-Datei.

In diesem Abschnitt werden wir sehen, wie und unterscheiden sich hinsichtlich der Art und Weise, wie Anmerkungen aktiviert werden.

3. Annotation Activation durch < context: annotation-config>

Das Annotation wird hauptsächlich verwendet, um die Annotationen zur Abhängigkeitsinjektion zu aktivieren. @Autowired , @Qualifier , @PostConstruct , @PreDestroy und @Resource sind einige davonkann lösen.

Lassen Sie uns ein einfaches Beispiel machen, um zu sehen, wie kann die XML-Konfiguration für uns vereinfachen.

Erstellen wir zunächst eine Klasse mit einem Abhängigkeitsfeld:

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

Definieren wir nun unsere Bohnen.

Bevor wir fortfahren, möchten wir darauf hinweisen, dass wir noch Beans im XML deklarieren müssen. Das ist, weilAktiviert die Anmerkungen nur für die Beans, die bereits im Anwendungskontext registriert sind .

Wie hier zu sehen ist, kommentierten wir das Account Feld mit @Autowired . @Autowired teilt Spring mit, dass dieses Feld eine Abhängigkeit ist, die automatisch von einer passenden Bean verdrahtet werden muss.

Wenn wir @Autowired nicht verwenden würden , müssten wir die accountService- Abhängigkeit manuell festlegen :

Jetzt können wir in einem Unit-Test auf unsere Beans und Abhängigkeiten verweisen:

@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, hier stimmt etwas nicht. Es sieht aus wie Frühling ist nicht die Verdrahtung Account obwohl wir es von kommentierten @Autowired . Es sieht so aus, als ob @Autowired nicht aktiv ist. Um dieses Problem zu lösen, fügen wir einfach die folgende Zeile über unsere XML-Datei ein:

4. Annotation Activation durch < context: component-scan>

Ähnlich wie , kann auch die Annotationen zur Abhängigkeitsinjektion erkennen und verarbeiten. Außerdem, erkennt Bean-Annotationen, die erkennt nicht .

Grundsätzlich, Erkennt die Anmerkungen durch Paket-Scannen . Anders ausgedrückt, es teilt Spring mit, welche Pakete gescannt werden müssen, um nach den kommentierten Beans oder Komponenten zu suchen.

@Component , @Repository , @Service , @Controller , @RestController und @Configuration sind mehrere davonerkennen kann .

Nun wollen wir sehen, wie wir unser vorheriges Beispiel vereinfachen können:

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

Hier markiert die Annotation @Component unsere Klassen als Beans . Jetzt können wir alle Bean-Definitionen aus unserer XML-Datei entfernen. Und natürlich müssen wir das behalten oben drauf:

Beachten Sie abschließend, dass Spring nach den kommentierten Beans und Abhängigkeiten unter dem Paket sucht, das durch das Basispaketattribut angegeben wird.

5. Schlussfolgerung

In diesem Tutorial haben wir die Unterschiede zwischen untersucht und .

Codebeispiele sind wie immer auf GitHub vorbei.