Inleiding tot Spring Boot Starters

1. Overzicht

Afhankelijkheidsbeheer is een cruciaal aspect van elk complex project. En dit handmatig doen is niet ideaal; hoe meer tijd je eraan besteedt, hoe minder tijd je hebt aan de andere belangrijke aspecten van het project.

Spring Boot-starters zijn gebouwd om precies dit probleem aan te pakken. Starter-POM's zijn een reeks handige afhankelijkheidsdescriptors die u in uw toepassing kunt opnemen. U krijgt een one-stop-shop voor alle Spring- en gerelateerde technologie die u nodig hebt, zonder dat u door voorbeeldcode hoeft te zoeken en heel veel afhankelijkheidsdescriptors hoeft te kopiëren en plakken.

We hebben meer dan 30 opstartprogramma's beschikbaar - laten we er enkele in de volgende secties bekijken.

2. De webstarter

Laten we eerst eens kijken naar het ontwikkelen van de REST-service; we kunnen bibliotheken gebruiken zoals Spring MVC, Tomcat en Jackson - veel afhankelijkheden voor een enkele applicatie.

Spring Boot-starters kunnen helpen om het aantal handmatig toegevoegde afhankelijkheden te verminderen door slechts één afhankelijkheid toe te voegen. Dus in plaats van handmatig de afhankelijkheden op te geven, voegt u één starter toe zoals in het volgende voorbeeld:

 org.springframework.boot spring-boot-starter-web 

Nu kunnen we een REST-controller maken. Eenvoudigheidshalve zullen we de database niet gebruiken en ons concentreren op de REST-controller:

@RestController openbare klasse GenericEntityController {privélijst entityList = nieuwe ArrayList (); @RequestMapping ("/ entity / all") openbare lijst findAll () {return entityList; } @RequestMapping (value = "/ entity", method = RequestMethod.POST) public GenericEntity addEntity (GenericEntity entiteit) {entityList.add (entiteit); terugkeer entiteit; } @RequestMapping ("/ entity / findby / {id}") public GenericEntity findById (@PathVariable Long id) {return entityList.stream (). filter (entity -> entity.getId (). equals (id)). findFirst (). get (); }}

De GenericEntity is een simpele boon met ID kaart van het type Lang en waarde van het type Draad.

Dat is alles - terwijl de applicatie draait, hebt u toegang tot // localhost: 8080 / entity / all en controleert u of de controller werkt.

We hebben een REST-applicatie gemaakt met een vrij minimale configuratie.

3. De teststarter

Voor het testen gebruiken we meestal de volgende set bibliotheken: Spring Test, JUnit, Hamcrest en Mockito. We kunnen al deze bibliotheken handmatig opnemen, maar Spring Boot starter kan worden gebruikt om deze bibliotheken automatisch op de volgende manier op te nemen:

 org.springframework.boot spring-boot-starter-test 

Merk op dat u het versienummer van een artefact niet hoeft op te geven. Spring Boot zal uitzoeken welke versie moet worden gebruikt - het enige dat u hoeft op te geven is de versie van spring-boot-starter-parent artefact. Als u later de Boot-bibliotheek en de afhankelijkheden moet upgraden, upgrade dan de Boot-versie op één plek en deze zorgt voor de rest.

Laten we de controller testen die we in het vorige voorbeeld hebben gemaakt.

Er zijn twee manieren om de controller te testen:

  • De nepomgeving gebruiken
  • De ingesloten Servlet-container gebruiken (zoals Tomcat of Jetty)

In dit voorbeeld gebruiken we een nepomgeving:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klassen = Application.class) @WebAppConfiguration openbare klasse SpringBootApplicationIntegrationTest {@Autowired privé WebApplicationContext webApplicationContext; privé MockMvc mockMvc; @Before public void setupMockMvc () {mockMvc = MockMvcBuilders.webAppContextSetup (webApplicationContext) .build (); } @Test openbare ongeldig gegevenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect () genereert uitzondering {MediaType contentType = nieuw MediaType (MediaType.APPLICATION_JSON.getType (), MediaType.APPLICATION_JSON.getSubtype (), Charset.forName) ("); mockMvc.perform (MockMvcRequestBuilders.get ("/ entity / all")). andExpect (MockMvcResultMatchers.status (). isOk ()). andExpect (MockMvcResultMatchers.content (). contentType (contentType)). andExpect (jsonPath ("$", hasSize (4))); }}

De bovenstaande test noemt de / entity / all endpoint en verifieert dat het JSON-antwoord 4 elementen bevat. Om deze test te laten slagen, moeten we ook onze lijst initialiseren in de controllerklasse:

openbare klasse GenericEntityController {privélijst entityList = nieuwe ArrayList (); {entityList.add (nieuwe GenericEntity (1l, "entity_1")); entityList.add (nieuwe GenericEntity (2l, "entity_2")); entityList.add (nieuwe GenericEntity (3l, "entity_3")); entityList.add (nieuwe GenericEntity (4l, "entity_4")); } // ...}

Wat hier belangrijk is, is dat @WebAppConfiguration annotatie en MockMVC maken deel uit van de lente-test module, hasSize is een Hamcrest-matcher, en @Voordat is een JUnit-annotatie. Deze zijn allemaal beschikbaar door één deze starter-afhankelijkheid te importeren.

4. De Data JPA Starter

De meeste webapplicaties hebben een soort persistentie - en dat is vrij vaak JPA.

In plaats van alle bijbehorende afhankelijkheden handmatig te definiëren, gaan we in plaats daarvan met de starter:

 org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime 

Merk op dat we standaard automatische ondersteuning hebben voor ten minste de volgende databases: H2, Derby en Hsqldb. In ons voorbeeld gebruiken we H2.

Laten we nu de repository voor onze entiteit maken:

openbare interface GenericEntityRepository breidt JpaRepository {} uit

Tijd om de code te testen. Hier is de JUnit-test:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klassen = Application.class) openbare klasse SpringBootJPATest {@Autowired privé GenericEntityRepository genericEntityRepository; @Test openbare leegte gegevenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK () {GenericEntity genericEntity = genericEntityRepository.save (nieuwe GenericEntity ("test")); GenericEntity foundEntity = genericEntityRepository.findOne (genericEntity.getId ()); assertNotNull (opgerichtEntity); assertEquals (genericEntity.getValue (), foundEntity.getValue ()); }}

We hebben geen tijd besteed aan het specificeren van de databaseleverancier, URL-verbinding en inloggegevens. Er is geen extra configuratie nodig omdat we profiteren van de solide Boot-standaardinstellingen; maar natuurlijk kunnen al deze details indien nodig nog worden geconfigureerd.

5. De Mail Starter

Een veel voorkomende taak bij de ontwikkeling van ondernemingen is het verzenden van e-mail, en het rechtstreeks omgaan met de Java Mail API kan meestal moeilijk zijn.

Spring Boot-starter verbergt deze complexiteit - e-mailafhankelijkheden kunnen op de volgende manier worden gespecificeerd:

 org.springframework.boot spring-boot-starter-mail 

Nu kunnen we de JavaMailSender, dus laten we wat tests schrijven.

Voor het testen hebben we een eenvoudige SMTP-server nodig. In dit voorbeeld gebruiken we Wiser. Dit is hoe we het kunnen opnemen in onze POM:

 org.subethamail subethasmtp 3.1.7 test 

De nieuwste versie van Wiser is te vinden op de centrale repository van Maven.

Hier is de broncode voor de test:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klassen = Application.class) openbare klasse SpringBootMailTest {@Autowired privé JavaMailSender javaMailSender; particuliere wijzer wijzer; private String userTo = "[e-mail beveiligd]"; private String userFrom = "[e-mail beveiligd]"; private String subject = "Testonderwerp"; private String textMail = "Tekstonderwerp mail"; @Before public void setUp () gooit Uitzondering {final int TEST_PORT = 25; wijzer = nieuwe Wijzer (TEST_PORT); wijzer.start (); } @After public void tearDown () gooit uitzondering {wiser.stop (); } @Test openbare ongeldige gegevenMail_whenSendAndReceived_thenCorrect () gooit uitzondering {SimpleMailMessage message = composeEmailMessage (); javaMailSender.send (bericht); Lijst met berichten = wiser.getMessages (); assertThat (berichten, hasSize (1)); WiserMessage wiserMessage = messages.get (0); assertEquals (userFrom, wiserMessage.getEnvelopeSender ()); assertEquals (userTo, wiserMessage.getEnvelopeReceiver ()); assertEquals (onderwerp, getSubject (wiserMessage)); assertEquals (textMail, getMessage (wiserMessage)); } private String getMessage (WiserMessage wiserMessage) gooit MessagingException, IOException {return wiserMessage.getMimeMessage (). getContent (). toString (). trim (); } private String getSubject (WiserMessage wiserMessage) gooit MessagingException {return wiserMessage.getMimeMessage (). getSubject (); } privé SimpleMailMessage composeEmailMessage () {SimpleMailMessage mailMessage = nieuwe SimpleMailMessage (); mailMessage.setTo (userTo); mailMessage.setReplyTo (userFrom); mailMessage.setFrom (userFrom); mailMessage.setSubject (onderwerp); mailMessage.setText (textMail); retour mailMessage; }}

In de test is het @Voordat en @Na methoden zijn verantwoordelijk voor het starten en stoppen van de mailserver.

Merk op dat we bedrading in de JavaMailSender boon - de boon was automatisch gemaakt door Spring Boot.

Net als alle andere standaardinstellingen in Boot, zijn de e-mailinstellingen voor de JavaMailSender kan worden aangepast in application.properties:

spring.mail.host = localhost spring.mail.port = 25 spring.mail.properties.mail.smtp.auth = false

Dus we hebben de mailserver geconfigureerd localhost: 25 en we hadden geen authenticatie nodig.

6. Conclusie

In dit artikel hebben we een overzicht gegeven van Starters, uitgelegd waarom we ze nodig hebben en voorbeelden gegeven hoe je ze in je projecten kunt gebruiken.

Laten we de voordelen van het gebruik van Spring Boot-starters samenvatten:

  • verhoog de beheersbaarheid van pom
  • productieklare, geteste en ondersteunde afhankelijkheidsconfiguraties
  • verkort de algehele configuratietijd voor het project

De actuele lijst met starters vind je hier. De broncode voor de voorbeelden is hier te vinden.