Introduktion til Spring Boot Starters

1. Oversigt

Afhængighedsstyring er kritiske aspekter af ethvert komplekst projekt. Og at gøre dette manuelt er mindre end ideelt; jo mere tid du brugte på det, jo mindre tid har du på de andre vigtige aspekter af projektet.

Spring Boot startere blev bygget til at løse netop dette problem. Start-POM'er er et sæt praktiske afhængighedsbeskrivelser, som du kan medtage i din applikation. Du får en one-stop-shop for al det forår og den relaterede teknologi, du har brug for, uden at skulle jage gennem prøvekode og kopiere og indsætte masser af afhængighedsbeskrivere.

Vi har mere end 30 startstartere tilgængelige - lad os se nogle af dem i de følgende afsnit.

2. Webstarteren

Lad os først se på at udvikle REST-tjenesten; vi kan bruge biblioteker som Spring MVC, Tomcat og Jackson - mange afhængigheder til en enkelt applikation.

Spring Boot-startere kan hjælpe med at reducere antallet af manuelt tilføjede afhængigheder bare ved at tilføje en afhængighed. Så i stedet for manuelt at specificere afhængighederne skal du blot tilføje en starter som i følgende eksempel:

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

Nu kan vi oprette en REST-controller. Af hensyn til enkelheden bruger vi ikke databasen og fokuserer på REST-controlleren:

@RestController offentlig klasse GenericEntityController {private List entityList = new ArrayList (); @RequestMapping ("/ entity / all") offentlig Liste findAll () {return entityList; } @RequestMapping (værdi = "/ enhed", metode = RequestMethod.POST) offentlig GenericEntity addEntity (GenericEntity enhed) {entityList.add (enhed); returret } @RequestMapping ("/ entity / findby / {id}") offentlig GenericEntity findById (@PathVariable Long id) {return entityList.stream (). filter (enhed -> entity.getId (). er lig med (id)). findFirst (). get (); }}

Det GenericEntity er en simpel bønne med id af typen Lang og værdi af typen Snor.

Det er det - mens applikationen kører, kan du få adgang til // localhost: 8080 / entity / all og kontrollere, at controlleren fungerer.

Vi har oprettet en REST-applikation med en ganske minimal konfiguration.

3. Teststarteren

Til test bruger vi normalt følgende sæt biblioteker: Spring Test, JUnit, Hamcrest og Mockito. Vi kan inkludere alle disse biblioteker manuelt, men Spring Boot starter kan bruges til automatisk at inkludere disse biblioteker på følgende måde:

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

Bemærk, at du ikke behøver at angive versionsnummeret på en artefakt. Spring Boot finder ud af, hvilken version der skal bruges - alt hvad du skal angive er versionen af spring-boot-starter-parent artefakt. Hvis du senere har brug for at opgradere Boot-biblioteket og afhængigheder, skal du bare opgradere Boot-versionen ét sted, så tager det sig af resten.

Lad os faktisk teste den controller, vi oprettede i det foregående eksempel.

Der er to måder at teste controlleren på:

  • Brug af det spotte miljø
  • Brug af den integrerede Servlet-container (som Tomcat eller Jetty)

I dette eksempel bruger vi et mock-miljø:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klasser = Application.class) @WebAppConfiguration offentlig klasse SpringBootApplicationIntegrationTest {@Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Før offentligt ugyldigt setupMockMvc () {mockMvc = MockMvcBuilders.webAppContextSetup (webApplicationContext) .build (); } @Test offentlig ugyldighed givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect () kaster undtagelse {MediaType contentType = ny MediaType (MediaType.APPLICATION_JSON.getType (), MediaType.APPLICATION_JSON.getSubtype (), Chars, " mockMvc.perform (MockMvcRequestBuilders.get ("/ entity / all")). andExpect (MockMvcResultMatchers.status (). isOk ()). andExpect (MockMvcResultMatchers.content (). contentType (contentType)). andExpect (jsonPath ("$", hasSize (4))); }}

Ovenstående test kalder / enhed / alle slutpunkt og verificerer, at JSON-svaret indeholder 4 elementer. For at denne test skal bestå, skal vi også initialisere vores liste i controller-klassen:

offentlig klasse GenericEntityController {private List entityList = new ArrayList (); {entityList.add (ny GenericEntity (1l, "entity_1")); entityList.add (ny GenericEntity (2l, "entity_2")); entityList.add (ny GenericEntity (3l, "entity_3")); entityList.add (ny GenericEntity (4l, "entity_4")); } // ...}

Hvad der er vigtigt her er det @WebAppConfiguration kommentar og MockMVC er en del af forårstest modul, hasSize er en Hamcrest matcher, og @Før er en JUnit-kommentar. Disse er alle tilgængelige ved at importere en denne ene startafhængighed.

4. Data JPA Starter

De fleste webapplikationer har en slags vedholdenhed - og det er ganske ofte JPA.

I stedet for at definere alle de tilknyttede afhængigheder manuelt - lad os gå med starteren i stedet:

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

Bemærk, at vi uden for boksen har automatisk support til mindst følgende databaser: H2, Derby og Hsqldb. I vores eksempel bruger vi H2.

Lad os nu oprette lageret for vores enhed:

offentlig grænseflade GenericEntityRepository udvider JpaRepository {}

Tid til at teste koden. Her er JUnit-testen:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klasser = Application.class) offentlig klasse SpringBootJPATest {@Autowired private GenericEntityRepository genericEntityRepository; @Test offentlig ugyldighed givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK () {GenericEntity genericEntity = genericEntityRepository.save (ny GenericEntity ("test")); GenericEntity foundationEntity = genericEntityRepository.findOne (genericEntity.getId ()); assertNotNull (foundationEntity); assertEquals (genericEntity.getValue (), foundationEntity.getValue ()); }}

Vi brugte ikke tid på at specificere databaseleverandøren, URL-forbindelsen og legitimationsoplysningerne. Ingen ekstra konfiguration er nødvendig, da vi drager fordel af de faste Boot-standarder; men selvfølgelig kan alle disse detaljer stadig konfigureres, hvis det er nødvendigt.

5. Mailstarter

En meget almindelig opgave i virksomhedsudvikling er at sende e-mail, og det kan normalt være svært at håndtere direkte med Java Mail API.

Spring Boot-starter skjuler denne kompleksitet - mailafhængigheder kan specificeres på følgende måde:

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

Nu kan vi bruge direkte JavaMailSender, så lad os skrive nogle tests.

Til testformålet har vi brug for en simpel SMTP-server. I dette eksempel bruger vi Wiser. Sådan kan vi inkludere det i vores POM:

 org.subethamail subethasmtp 3.1.7 test 

Den seneste version af Wiser kan findes i Maven centrale arkiv.

Her er kildekoden til testen:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klasser = Application.class) offentlig klasse SpringBootMailTest {@Autowired privat JavaMailSender javaMailSender; privat klogere klogere; private String userTo = "[e-mail-beskyttet]"; private String userFrom = "[e-mail-beskyttet]"; private String subject = "Test subject"; private String textMail = "Tekstemne-mail"; @Før offentligt ugyldigt setUp () kaster undtagelse {final int TEST_PORT = 25; klogere = ny klogere (TEST_PORT); klogere.start (); } @Efter offentlig ugyldighed tearDown () kaster undtagelse {wiser.stop (); } @ Test offentligt ugyldigt givenMail_whenSendAndReceived_thenCorrect () kaster Undtagelse {SimpleMailMessage besked = composeEmailMessage (); javaMailSender.send (besked); Listebeskeder = wiser.getMessages (); assertThat (beskeder, hasSize (1)); WiserMessage wiserMessage = messages.get (0); assertEquals (userFrom, wiserMessage.getEnvelopeSender ()); assertEquals (userTo, wiserMessage.getEnvelopeReceiver ()); assertEquals (subject, getSubject (wiserMessage)); assertEquals (textMail, getMessage (wiserMessage)); } privat streng getMessage (WiserMessage wiserMessage) kaster MessagingException, IOException {returner wiserMessage.getMimeMessage (). getContent (). toString (). trim (); } privat streng getSubject (WiserMessage wiserMessage) kaster MessagingException {returner wiserMessage.getMimeMessage (). getSubject (); } privat SimpleMailMessage composeEmailMessage () {SimpleMailMessage mailMessage = ny SimpleMailMessage (); mailMessage.setTo (userTo); mailMessage.setReplyTo (userFrom); mailMessage.setFrom (userFrom); mailMessage.setSubject (emne); mailMessage.setText (textMail); return mailMessage; }}

I testen blev den @Før og @Efter metoder er ansvarlige for start og stop af mailserveren.

Bemærk, at vi kabler i JavaMailSender bønne - bønnen var oprettes automatisk af Spring Boot.

Ligesom alle andre standardindstillinger i Boot, e-mail-indstillingerne for JavaMailSender kan tilpasses i application.properties:

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

Så vi konfigurerede mailserveren til lokal vært: 25 og vi krævede ikke godkendelse.

6. Konklusion

I denne artikel har vi givet et overblik over startere, forklaret hvorfor vi har brug for dem og givet eksempler på, hvordan du bruger dem i dine projekter.

Lad os sammenfatte fordelene ved at bruge Spring Boot startere:

  • øge pom håndterbarhed
  • produktionsklare, testede og understøttede afhængighedskonfigurationer
  • reducere den samlede konfigurationstid for projektet

Den aktuelle liste over startere kan findes her. Kildekoden til eksemplerne kan findes her.