Introduksjon til vårstartstartere
1. Oversikt
Avhengighetsstyring er kritiske aspekter ved ethvert komplekst prosjekt. Og å gjøre dette manuelt er mindre enn ideelt; jo mer tid du brukte på det jo mindre tid har du på de andre viktige aspektene av prosjektet.
Spring Boot-forretter ble bygget for å løse akkurat dette problemet. Start-POM-er er et sett med praktiske avhengighetsbeskrivere som du kan inkludere i applikasjonen din. Du får en one-stop-shop for all våren og relatert teknologi du trenger, uten å måtte jakte på eksempelkode og kopiere og lime inn masse avhengighetsbeskrivere.
Vi har mer enn 30 startstarter tilgjengelig - la oss se noen av dem i de følgende avsnittene.
2. Nettstarteren
La oss først se på å utvikle REST-tjenesten; vi kan bruke biblioteker som Spring MVC, Tomcat og Jackson - mange avhengigheter for en enkelt applikasjon.
Spring Boot-startere kan bidra til å redusere antall avhengigheter manuelt lagt til bare ved å legge til en avhengighet. Så i stedet for å spesifisere avhengighetene manuelt, legg bare til en startpakke som i følgende eksempel:
org.springframework.boot spring-boot-starter-web
Nå kan vi opprette en REST-kontroller. For enkelhets skyld vil vi ikke bruke databasen og fokusere på REST-kontrolleren:
@RestController offentlig klasse GenericEntityController {private List entityList = new ArrayList (); @RequestMapping ("/ entity / all") offentlig Liste findAll () {return entityList; } @RequestMapping (value = "/ entity", method = RequestMethod.POST) public GenericEntity addEntity (GenericEntity entity) {entityList.add (entity); retur enhet; } @RequestMapping ("/ entity / findby / {id}") offentlig GenericEntity findById (@PathVariable Long id) {return entityList.stream (). filter (entity -> entity.getId (). equals (id)). findFirst (). get (); }}
De GenericEntity er en enkel bønne med id av typen Lang og verdi av typen String.
Det er det - når applikasjonen kjører, kan du få tilgang til // localhost: 8080 / entity / all og sjekke at kontrolleren fungerer.
Vi har laget en REST-applikasjon med ganske minimal konfigurasjon.
3. Teststarteren
For testing bruker vi vanligvis følgende sett med biblioteker: Spring Test, JUnit, Hamcrest og Mockito. Vi kan inkludere alle disse bibliotekene manuelt, men Spring Boot starter kan brukes til å automatisk inkludere disse bibliotekene på følgende måte:
org.springframework.boot spring-boot-starter-test test
Legg merke til at du ikke trenger å spesifisere versjonsnummeret til en gjenstand. Spring Boot vil finne ut hvilken versjon du skal bruke - alt du trenger å spesifisere er versjonen av spring-boot-starter-parent gjenstand. Hvis du senere må oppgradere Boot-biblioteket og avhengigheter, er det bare å oppgradere Boot-versjonen på ett sted, så vil den ta seg av resten.
La oss faktisk teste kontrolleren vi opprettet i forrige eksempel.
Det er to måter å teste kontrolleren på:
- Bruke det latterlige miljøet
- Bruke den innebygde Servlet-beholderen (som Tomcat eller Jetty)
I dette eksemplet bruker vi et hånlig miljø:
@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest {@Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Før offentlig ugyldig setupMockMvc () {mockMvc = MockMvcBuilders.webAppContextSetup (webApplicationContext) .build (); } @Test offentlig ugyldig gittRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect () kaster unntak {MediaType contentType = new MediaType (MediaType.APPLICATION_JSON.getType (), MediaType.APPLICATION_JSON.getSubtype (), Chars, "; Chars)") mockMvc.perform (MockMvcRequestBuilders.get ("/ entity / all")). andExpect (MockMvcResultMatchers.status (). isOk ()). andExpect (MockMvcResultMatchers.content (). contentType (contentType)). andExpect (jsonPath ("$", hasSize (4))); }}
Ovennevnte test kaller / enhet / alt endepunkt og verifiserer at JSON-svaret inneholder 4 elementer. For at denne testen skal bestå, må vi også initialisere listen vår i kontrollerklassen:
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")); } // ...}
Det som er viktig her er at @WebAppConfiguration kommentar og MockMVC er en del av vårprøve modul, hasSize er en Hamcrest-matcher, og @Før er en JUnit-kommentar. Disse er alle tilgjengelige ved å importere en denne startavhengigheten.
4. Data JPA Starter
De fleste nettapplikasjoner har en slags utholdenhet - og det er ganske ofte JPA.
I stedet for å definere alle tilknyttede avhengigheter manuelt - la oss gå med starteren i stedet:
org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 runtime
Legg merke til at vi utenfor boksen har automatisk støtte for minst følgende databaser: H2, Derby og Hsqldb. I vårt eksempel bruker vi H2.
La oss nå opprette depotet for enheten vår:
offentlig grensesnitt GenericEntityRepository utvider JpaRepository {}
På tide å teste koden. Her er JUnit-testen:
@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klasser = Application.class) offentlig klasse SpringBootJPATest {@Autowired private GenericEntityRepository genericEntityRepository; @Test offentlig ugyldighet gittGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK () {GenericEntity genericEntity = genericEntityRepository.save (ny GenericEntity ("test")); GenericEntity foundationEntity = genericEntityRepository.findOne (genericEntity.getId ()); assertNotNull (foundationEntity); assertEquals (genericEntity.getValue (), foundationEntity.getValue ()); }}
Vi brukte ikke tid på å spesifisere databaseleverandøren, URL-tilkoblingen og legitimasjonen. Ingen ekstra konfigurasjon er nødvendig ettersom vi drar nytte av de solide standardinnstillingene; men selvfølgelig kan alle disse detaljene fortsatt konfigureres om nødvendig.
5. Mail Starter
En veldig vanlig oppgave i bedriftsutvikling er å sende e-post, og det kan vanligvis være vanskelig å håndtere direkte med Java Mail API.
Spring Boot starter starter denne kompleksiteten - e-postavhengigheter kan spesifiseres på følgende måte:
org.springframework.boot spring-boot-starter-mail
Nå kan vi bruke direkte JavaMailSender, så la oss skrive noen tester.
For testformålet trenger vi en enkel SMTP-server. I dette eksemplet bruker vi Wiser. Slik kan vi inkludere det i vår POM:
org.subethamail subethasmtp 3.1.7 test
Den siste versjonen av Wiser finner du på Maven sentrale arkiv.
Her er kildekoden for testen:
@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (klasser = Application.class) offentlig klasse SpringBootMailTest {@Autowired privat JavaMailSender javaMailSender; privat klokere klokere; private String userTo = "[e-postbeskyttet]"; private String userFrom = "[e-postbeskyttet]"; private String subject = "Test subject"; private String textMail = "Tekstemne-post"; @Før offentlige ugyldig setUp () kaster unntak {final int TEST_PORT = 25; klokere = ny klokere (TEST_PORT); klokere.start (); } @Efter offentlig ugyldighet kaster tearDown () Unntak {wiser.stop (); } @Test offentlig ugyldig givenMail_whenSendAndReceived_thenCorrect () kaster Unntak {SimpleMailMessage melding = composeEmailMessage (); javaMailSender.send (melding); Listemeldinger = wiser.getMessages (); assertThat (meldinger, 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 {return wiserMessage.getMimeMessage (). getContent (). toString (). trim (); } privat streng getSubject (WiserMessage wiserMessage) kaster MessagingException {return 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 ble den @Før og @Etter metodene er ansvarlige for å starte og stoppe e-postserveren.
Legg merke til at vi kobler oss til JavaMailSender bønne - bønnen var automatisk opprettet av Spring Boot.
Akkurat som alle andre standardinnstillinger i Boot, e-postinnstillingene for JavaMailSender kan tilpasses i application.properties:
spring.mail.host = localhost spring.mail.port = 25 spring.mail.properties.mail.smtp.auth = false
Så vi konfigurerte e-postserveren på lokal vert: 25 og vi krevde ikke autentisering.
6. Konklusjon
I denne artikkelen har vi gitt en oversikt over forretter, forklart hvorfor vi trenger dem og gitt eksempler på hvordan du kan bruke dem i prosjektene dine.
La oss oppsummere fordelene ved å bruke vårstarter:
- øke håndterbarheten av pom
- produksjonsklare, testede og støttede avhengighetskonfigurasjoner
- redusere den totale konfigurasjonstiden for prosjektet
Den faktiske listen over forretter finner du her. Kildekoden for eksemplene finner du her.