Uvod u Spring Boot Starters

1. Pregled

Upravljanje ovisnostima kritični je aspekt svakog složenog projekta. A raditi ovo ručno manje je od idealnog; što više vremena potrošite na to, manje vremena imate na ostalim važnim aspektima projekta.

Spring Boot starteri napravljeni su kako bi se riješio upravo ovaj problem. Početni POM-ovi skup su prikladnih deskriptora ovisnosti koje možete uključiti u svoju aplikaciju. Dobit ćete sve na jednom mjestu za svu proljetnu i srodnu tehnologiju koja vam je potrebna, a da ne morate loviti uzorak koda i kopirati-zalijepiti hrpu deskriptora ovisnosti.

Dostupno nam je više od 30 pokretača za pokretanje sustava - pogledajmo neke od njih u sljedećim odjeljcima.

2. Web Starter

Prvo, pogledajmo razvoj REST usluge; možemo koristiti knjižnice poput Spring MVC, Tomcat i Jackson - puno ovisnosti za jednu aplikaciju.

Početnici Spring Boot-a mogu pomoći smanjiti broj ručno dodanih ovisnosti samo dodavanjem jedne ovisnosti. Dakle, umjesto da ručno specificirate ovisnosti, dodajte samo jedan pokretač kao u sljedećem primjeru:

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

Sada možemo stvoriti REST kontroler. Radi jednostavnosti nećemo koristiti bazu podataka i usredotočiti se na REST kontroler:

@RestController javna klasa GenericEntityController {privatni popis entityList = novi ArrayList (); @RequestMapping ("/ entity / all") javni popis findAll () {return entityList; } @RequestMapping (value = "/ entity", method = RequestMethod.POST) public GenericEntity addEntity (GenericEntity entity) {entityList.add (entity); entitet povratka; } @RequestMapping ("/ entity / findby / {id}") public GenericEntity findById (@PathVariable Long id) {return entityList.stream (). filtar (entitet -> entitet.getId (). jednako (id)). findFirst (). get (); }}

The GenericEntity je jednostavan grah sa iskaznica tipa Dugo i vrijednost tipa Niz.

To je to - s pokrenutom aplikacijom možete pristupiti // localhost: 8080 / entity / all i provjeriti radi li kontroler.

Stvorili smo REST aplikaciju s prilično minimalnom konfiguracijom.

3. Test Starter

Za testiranje obično koristimo sljedeći skup knjižnica: Spring Test, JUnit, Hamcrest i Mockito. Sve ove knjižnice možemo uključiti ručno, ali pokretač Spring Boot može se koristiti za automatsko uključivanje tih knjižnica na sljedeći način:

 org.springframework.boot test proljetni-boot-starter-test 

Primijetite da ne trebate navesti broj verzije artefakta. Spring Boot će shvatiti koju će verziju koristiti - sve što trebate je inačica proljeće-čizma-starter-roditelj artefakt. Ako kasnije budete trebali nadograditi knjižnicu Boot i ovisnosti, samo nadogradite inačicu Boot na jednom mjestu, a ona će se pobrinuti za ostalo.

Isprobajmo zapravo kontroler koji smo stvorili u prethodnom primjeru.

Postoje dva načina za testiranje kontrolera:

  • Korištenje lažnog okruženja
  • Korištenje ugrađenog spremnika Servlet (poput Tomcat ili Jetty)

U ovom ćemo primjeru koristiti lažno okruženje:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) @WebAppConfiguration javna klasa SpringBootApplicationIntegrationTest {@Autowired private WebApplicationContext webApplicationContext; privatni MockMvc mockMvc; @Prije javne void setupMockMvc () {mockMvc = MockMvcBuilders.webAppContextSetup (webApplicationContext) .build (); } @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect () baca izuzetak {MediaType contentType = new MediaType (MediaType.APPLICATION_JSON.getType (), MediaType.APPLICATION_JSON.getSubtype (), Charset.utf (N); mockMvc.perform (MockMvcRequestBuilders.get ("/ entitet / sve")). andExpect (MockMvcResultMatchers.status (). isOk ()). andExpect (MockMvcResultMatchers.content (). contentType (contentType)). andExpect (jsonPath ("$", hasSize (4))); }}

Gornji test poziva / entitet / sve krajnju točku i provjerava sadrži li odgovor JSON 4 elementa. Da bi ovaj test prošao, također moramo inicijalizirati naš popis u klasi kontrolera:

javna klasa GenericEntityController {privatni popis entityList = novi ArrayList (); {entityList.add (novi GenericEntity (1l, "entity_1")); entityList.add (novi GenericEntity (2l, "entity_2")); entityList.add (novi GenericEntity (3l, "entity_3")); entityList.add (novi GenericEntity (4l, "entity_4")); } // ...}

Ono što je ovdje važno jest to @WebAppConfiguration anotacija i MockMVC dio su proljetni test modul, hasSize je Hamcrestov meč i @Prije je napomena JUnit. Sve su dostupne uvozom jedne ove zavisnosti o starteru.

4. Data JPA Starter

Većina web aplikacija ima neku vrstu trajnosti - a to je često JPA.

Umjesto da ručno definirate sve povezane ovisnosti - idemo umjesto toga s pokretačem:

 org.springframework.boot spring-boot-starter-data-jpa com.h2database h2 vrijeme izvođenja 

Primijetite da odmah imamo automatsku podršku za barem sljedeće baze podataka: H2, Derby i Hsqldb. U našem ćemo primjeru upotrijebiti H2.

Sada kreirajmo spremište za naš entitet:

javno sučelje GenericEntityRepository proširuje JpaRepository {}

Vrijeme je za testiranje koda. Evo JUnit testa:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) javna klasa SpringBootJPATest {@Autowired private GenericEntityRepository genericEntityRepository; @Test javna praznina givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK () {GenericEntity genericEntity = genericEntityRepository.save (new GenericEntity ("test")); GenericEntity foundEntity = genericEntityRepository.findOne (genericEntity.getId ()); assertNotNull (foundEntity); assertEquals (genericEntity.getValue (), foundEntity.getValue ()); }}

Nismo trošili vrijeme na određivanje dobavljača baze podataka, URL veze i vjerodajnica. Nije potrebna dodatna konfiguracija jer imamo koristi od čvrste zadane postavke za podizanje sustava; ali naravno svi se ti detalji i dalje mogu konfigurirati ako je potrebno.

5. Pokretač pošte

Vrlo čest zadatak u razvoju poduzeća je slanje e-pošte, a izravno bavljenje Java Mail API-jem obično može biti teško.

Spring Boot starter skriva ovu složenost - ovisnosti pošte mogu se odrediti na sljedeći način:

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

Sada možemo izravno koristiti JavaMailSender, pa napišimo neke testove.

Za potrebe testiranja potreban nam je jednostavan SMTP poslužitelj. U ovom ćemo primjeru koristiti Wiser. Evo kako ga možemo uključiti u naš POM:

 test org.subethamail subethasmtp 3.1.7 

Najnoviju verziju Wisera možete pronaći na Mavenovom središnjem spremištu.

Evo izvornog koda za test:

@RunWith (SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration (classes = Application.class) javna klasa SpringBootMailTest {@Autowired private JavaMailSender javaMailSender; privatni Wiser mudriji; private String userTo = "[e-pošta zaštićena]"; private String userFrom = "[e-pošta zaštićena]"; private String subject = "Test subject"; private String textMail = "Tekst poruke pošte"; @ Prije javne void setUp () baca iznimku {final int TEST_PORT = 25; mudrije = novo Mudrije (TEST_PORT); mudrije.start (); } @Nakon javne praznine tearDown () baca izuzetak {wiser.stop (); } @Test javna praznina givenMail_whenSendAndReceived_thenCorrect () baca iznimku {SimpleMailMessage message = composeEmailMessage (); javaMailSender.send (poruka); Popis poruka = ​​wiser.getMessages (); assertThat (poruke, hasSize (1)); WiserMessage wiserMessage = messages.get (0); assertEquals (userFrom, wiserMessage.getEnvelopeSender ()); assertEquals (userTo, wiserMessage.getEnvelopeReceiver ()); assertEquals (subject, getSubject (wiserMessage)); assertEquals (textMail, getMessage (wiserMessage)); } private String getMessage (WiserMessage wiserMessage) baca MessagingException, IOException {return wiserMessage.getMimeMessage (). getContent (). toString (). trim (); } private String getSubject (WiserMessage wiserMessage) baca MessagingException {return wiserMessage.getMimeMessage (). getSubject (); } private SimpleMailMessage composeEmailMessage () {SimpleMailMessage mailMessage = novo SimpleMailMessage (); mailMessage.setTo (userTo); mailMessage.setReplyTo (userFrom); mailMessage.setFrom (userFrom); mailMessage.setSubject (subject); mailMessage.setText (textMail); vratiti mailMessage; }}

U testu, @Prije i @Nakon metode su zadužene za pokretanje i zaustavljanje poslužitelja pošte.

Primijetite da ožičimo u JavaMailSender grah - grah je bio automatski stvorio Spring Boot.

Kao i bilo koja druga zadana postavka u sustavu Boot, postavke e-pošte za JavaMailSender može se prilagoditi u primjena.svojstva:

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

Stoga smo konfigurirali poslužitelj pošte localhost: 25 i nismo trebali autentifikaciju.

6. Zaključak

U ovom smo članku dali pregled Startera, objasnili zašto nam trebaju i pružili primjere kako ih koristiti u svojim projektima.

Osvrnimo se na prednosti korištenja pokretača Spring Boot:

  • povećati pom upravljivost
  • konfiguracije ovisnosti spremne za proizvodnju, testirane i podržane
  • smanjiti ukupno vrijeme konfiguracije za projekt

Stvarni popis predjela možete pronaći ovdje. Izvorni kod za primjere možete pronaći ovdje.