Introduzione a Spring Boot Starters

1. Panoramica

La gestione delle dipendenze è un aspetto critico di qualsiasi progetto complesso. E farlo manualmente è tutt'altro che ideale; più tempo ci dedichi, meno tempo hai sugli altri aspetti importanti del progetto.

Gli starter Spring Boot sono stati creati per risolvere esattamente questo problema. I POM iniziali sono una serie di comodi descrittori di dipendenza che puoi includere nella tua applicazione. Ottieni uno sportello unico per tutta la primavera e la tecnologia correlata di cui hai bisogno, senza dover cercare nel codice di esempio e copiare e incollare carichi di descrittori di dipendenza.

Abbiamo più di 30 avviatori di avvio disponibili: vediamo alcuni di loro nelle sezioni seguenti.

2. Il Web Starter

Per prima cosa, esaminiamo lo sviluppo del servizio REST; possiamo usare librerie come Spring MVC, Tomcat e Jackson: molte dipendenze per una singola applicazione.

Gli avviatori Spring Boot possono aiutare a ridurre il numero di dipendenze aggiunte manualmente semplicemente aggiungendo una dipendenza. Quindi, invece di specificare manualmente le dipendenze, aggiungi uno starter come nell'esempio seguente:

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

Ora possiamo creare un controller REST. Per semplicità non utilizzeremo il database e ci concentreremo sul controller REST:

@RestController public class GenericEntityController { private List entityList = new ArrayList(); @RequestMapping("/entity/all") public List findAll() { return entityList; } @RequestMapping(value = "/entity", method = RequestMethod.POST) public GenericEntity addEntity(GenericEntity entity) { entityList.add(entity); return entity; } @RequestMapping("/entity/findby/{id}") public GenericEntity findById(@PathVariable Long id) { return entityList.stream(). filter(entity -> entity.getId().equals(id)). findFirst().get(); } }

Il GenericEntity è un semplice fagioli con id di tipo lungo e il valore di tipo String .

Questo è tutto: con l'applicazione in esecuzione, puoi accedere a // localhost: 8080 / entity / all e verificare che il controller funzioni.

Abbiamo creato un'applicazione REST con una configurazione piuttosto minima.

3. Il test starter

Per i test di solito usiamo il seguente set di librerie: Spring Test, JUnit, Hamcrest e Mockito. Possiamo includere tutte queste librerie manualmente, ma lo starter Spring Boot può essere utilizzato per includere automaticamente queste librerie nel modo seguente:

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

Notare che non è necessario specificare il numero di versione di un artefatto. Spring Boot capirà quale versione usare: tutto ciò che devi specificare è la versione di spring-boot-starter-parent artifact. Se in seguito è necessario aggiornare la libreria di avvio e le dipendenze, è sufficiente aggiornare la versione di avvio in un unico posto e si occuperà del resto.

Proviamo effettivamente il controller che abbiamo creato nell'esempio precedente.

Esistono due modi per testare il controller:

  • Utilizzando l'ambiente fittizio
  • Utilizzo del contenitore Servlet incorporato (come Tomcat o Jetty)

In questo esempio useremo un ambiente fittizio:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration public class SpringBootApplicationIntegrationTest { @Autowired private WebApplicationContext webApplicationContext; private MockMvc mockMvc; @Before public void setupMockMvc() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } @Test public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect() throws Exception { MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")). andExpect(MockMvcResultMatchers.status().isOk()). andExpect(MockMvcResultMatchers.content().contentType(contentType)). andExpect(jsonPath("$", hasSize(4))); } }

Il test precedente chiama l' endpoint / entity / all e verifica che la risposta JSON contenga 4 elementi. Affinché questo test passi, dobbiamo anche inizializzare il nostro elenco nella classe controller:

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

Ciò che è importante qui è che l' annotazione @WebAppConfiguration e MockMVC fanno parte del modulo spring-test , hasSize è un matcher Hamcrest e @Before è un'annotazione JUnit. Questi sono tutti disponibili importando una dipendenza iniziale.

4. Il Data JPA Starter

La maggior parte delle applicazioni web ha una sorta di persistenza, e questo è abbastanza spesso JPA.

Invece di definire manualmente tutte le dipendenze associate, andiamo invece con lo starter:

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

Si noti che per impostazione predefinita abbiamo il supporto automatico almeno per i seguenti database: H2, Derby e Hsqldb. Nel nostro esempio, useremo H2.

Ora creiamo il repository per la nostra entità:

public interface GenericEntityRepository extends JpaRepository {}

È ora di testare il codice. Ecco il test JUnit:

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

Non abbiamo perso tempo a specificare il fornitore del database, la connessione URL e le credenziali. Non è necessaria alcuna configurazione aggiuntiva poiché stiamo beneficiando delle solide impostazioni di avvio; ma ovviamente tutti questi dettagli possono ancora essere configurati se necessario.

5. Il Mail Starter

Un'attività molto comune nello sviluppo aziendale è l'invio di e-mail e gestire direttamente l'API Java Mail di solito può essere difficile.

Lo starter di Spring Boot nasconde questa complessità: le dipendenze della posta possono essere specificate nel modo seguente:

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

Ora possiamo usare direttamente JavaMailSender , quindi scriviamo alcuni test.

Ai fini del test, abbiamo bisogno di un semplice server SMTP. In questo esempio, useremo Wiser. Ecco come possiamo includerlo nel nostro POM:

 org.subethamail subethasmtp 3.1.7 test  

L'ultima versione di Wiser può essere trovata nel repository centrale di Maven.

Ecco il codice sorgente per il test:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) public class SpringBootMailTest { @Autowired private JavaMailSender javaMailSender; private Wiser wiser; private String userTo = "[email protected]"; private String userFrom = "[email protected]"; private String subject = "Test subject"; private String textMail = "Text subject mail"; @Before public void setUp() throws Exception { final int TEST_PORT = 25; wiser = new Wiser(TEST_PORT); wiser.start(); } @After public void tearDown() throws Exception { wiser.stop(); } @Test public void givenMail_whenSendAndReceived_thenCorrect() throws Exception { SimpleMailMessage message = composeEmailMessage(); javaMailSender.send(message); List messages = wiser.getMessages(); assertThat(messages, 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) throws MessagingException, IOException { return wiserMessage.getMimeMessage().getContent().toString().trim(); } private String getSubject(WiserMessage wiserMessage) throws MessagingException { return wiserMessage.getMimeMessage().getSubject(); } private SimpleMailMessage composeEmailMessage() { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo(userTo); mailMessage.setReplyTo(userFrom); mailMessage.setFrom(userFrom); mailMessage.setSubject(subject); mailMessage.setText(textMail); return mailMessage; } }

Nel test, i metodi @Before e @After hanno il compito di avviare e arrestare il server di posta.

Si noti che stiamo collegando il bean JavaMailSender : il bean è stato creato automaticamente da Spring Boot .

Proprio come qualsiasi altra impostazione predefinita in Boot, le impostazioni di posta elettronica per JavaMailSender possono essere personalizzate in application.properties :

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

Quindi abbiamo configurato il server di posta su localhost: 25 e non abbiamo richiesto l'autenticazione.

6. Conclusione

In questo articolo abbiamo fornito una panoramica degli Starter, spiegato perché ne abbiamo bisogno e fornito esempi su come utilizzarli nei tuoi progetti.

Ricapitoliamo i vantaggi dell'utilizzo degli starter Spring Boot:

  • aumentare la gestibilità del pom
  • configurazioni delle dipendenze pronte per la produzione, testate e supportate
  • diminuire il tempo di configurazione complessivo del progetto

L'elenco effettivo degli antipasti può essere trovato qui. Il codice sorgente per gli esempi può essere trovato qui.