Verschil tussen vs

1. Overzicht

In deze tutorial gaan we leren over de verschillen tussen twee belangrijke XML-configuratie-elementen van Spring: en .

2. Definities van bonen

Zoals we allemaal weten, biedt Spring ons twee manieren om onze bonen en afhankelijkheden te definiëren: XML-configuratie en Java-annotaties. We kunnen de annotaties van Spring ook in twee groepen indelen: annotaties met afhankelijkheidsinjectie en bean-annotaties.

Voorafgaand aan annotaties moesten we al onze bonen en afhankelijkheden handmatig definiëren in XML-configuratiebestanden. Nu dankzij de annotaties van Spring, het kan automatisch al onze bonen en afhankelijkheden voor ons ontdekken en bedraden. We kunnen dus op zijn minst de XML elimineren die nodig is voor bonen en afhankelijkheden.

Dat moeten we echter onthouden annotaties zijn nutteloos tenzij we ze activeren. Om ze te activeren, kunnen we beide toevoegen of bovenop ons XML-bestand.

In dit gedeelte zullen we zien hoe en verschillen van elkaar in termen van hun manier om annotaties te activeren.

3. Annotatieactivering door <context: annotation-config>

De annotatie wordt voornamelijk gebruikt om de annotaties van afhankelijkheidsinjectie te activeren. @Autowired, @Kwalificatie, @PostConstruct, @PreDestroy, en @Resource zijn enkele van degenen die kan oplossen.

Laten we een eenvoudig voorbeeld maken om te zien hoe kan de XML-configuratie voor ons vereenvoudigen.

Laten we eerst een klasse maken met een afhankelijkheidsveld:

openbare klasse UserService {@Autowired privé AccountService accountService; }
openbare klas AccountService {}

Laten we nu onze bonen definiëren.

Voordat we verder gaan, willen we erop wijzen dat we nog steeds bonen in de XML moeten declareren. Dat is omdat activeert de annotaties alleen voor de bonen die al in de toepassingscontext zijn geregistreerd.

Zoals hier te zien is, hebben we de accountService veld met @Autowired. @Autowired vertelt Spring dat dit veld een afhankelijkheid is die automatisch moet worden bedraad door een bijpassende bean.

Als we niet gebruikten @Autowired, dan moeten we de accountService afhankelijkheid handmatig:

Nu kunnen we verwijzen naar onze bonen en afhankelijkheden in een eenheidstest:

@Test openbare ongeldige gegevenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded () {ApplicationContext context = nieuwe 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, er klopt hier iets niet. Het lijkt erop dat de lente de accountService ook al hebben we het geannoteerd door @Autowired. Het lijkt op @Autowired is niet actief. Om dit probleem op te lossen, voegen we eenvoudig de volgende regel toe aan ons XML-bestand:

4. Annotatieactivering door <context: component-scan>

Zoals vergelijkbaar met , kan de annotaties van de afhankelijkheidsinjectie ook herkennen en verwerken. Bovendien, herkent bean-annotaties die detecteert niet.

Eigenlijk, detecteert de annotaties door pakketten te scannen. Anders gezegd, het vertelt Spring welke pakketten moeten worden gescand om te zoeken naar de geannoteerde bonen of componenten.

@Component, @Repository, @Onderhoud, @Controller, @RestController, en @Configuratie zijn er verschillende die kan detecteren.

Laten we nu eens kijken hoe we ons vorige voorbeeld kunnen vereenvoudigen:

@Component openbare klasse UserService {@Autowired private AccountService accountService; } 
@Component openbare klas AccountService {}

Hier de @Component annotatie markeert onze klassen als bonen. Nu kunnen we alle bean-definities uit ons XML-bestand verwijderen. En natuurlijk moeten we de daar bovenop:

Laten we tot slot opmerken dat Spring zal zoeken naar de geannoteerde bonen en afhankelijkheden onder het pakket dat wordt aangegeven door de basispakket attribuut.

5. Conclusie

In deze tutorial hebben we de verschillen tussen en .

Codevoorbeelden zijn, zoals altijd, voorbij op GitHub.