Introduction aux démarreurs Spring Boot

1. Vue d'ensemble

La gestion des dépendances est un aspect critique de tout projet complexe. Et faire cela manuellement est loin d'être idéal; plus vous y consacrez de temps, moins vous disposez de temps sur les autres aspects importants du projet.

Les démarreurs Spring Boot ont été conçus pour résoudre exactement ce problème. Les POM de démarrage sont un ensemble de descripteurs de dépendances pratiques que vous pouvez inclure dans votre application. Vous obtenez un guichet unique pour tout le Spring et la technologie connexe dont vous avez besoin, sans avoir à rechercher des exemples de code et à copier-coller des tonnes de descripteurs de dépendances.

Nous avons plus de 30 démarreurs de démarrage disponibles - voyons certains d'entre eux dans les sections suivantes.

2. Le Web Starter

Examinons d'abord le développement du service REST; nous pouvons utiliser des bibliothèques comme Spring MVC, Tomcat et Jackson - beaucoup de dépendances pour une seule application.

Les démarreurs Spring Boot peuvent aider à réduire le nombre de dépendances ajoutées manuellement simplement en ajoutant une dépendance. Donc, au lieu de spécifier manuellement les dépendances, ajoutez simplement un démarreur comme dans l'exemple suivant:

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

Nous pouvons maintenant créer un contrôleur REST. Par souci de simplicité, nous n'utiliserons pas la base de données et nous nous concentrerons sur le contrôleur 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(); } }

Le GenericEntity est un haricot simple identifiant de type long et la valeur de type chaîne .

Voilà - avec l'application en cours d'exécution, vous pouvez accéder à // localhost: 8080 / entity / all et vérifier que le contrôleur fonctionne.

Nous avons créé une application REST avec une configuration assez minimale.

3. Le démarreur de test

Pour les tests, nous utilisons généralement l'ensemble de bibliothèques suivant: Spring Test, JUnit, Hamcrest et Mockito. Nous pouvons inclure toutes ces bibliothèques manuellement, mais Spring Boot starter peut être utilisé pour inclure automatiquement ces bibliothèques de la manière suivante:

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

Notez que vous n'avez pas besoin de spécifier le numéro de version d'un artefact. Spring Boot déterminera quelle version utiliser - tout ce que vous devez spécifier est la version de l' artefact spring-boot-starter-parent . Si plus tard vous devez mettre à niveau la bibliothèque de démarrage et les dépendances, mettez simplement à niveau la version de démarrage en un seul endroit et elle se chargera du reste.

Testons en fait le contrôleur que nous avons créé dans l'exemple précédent.

Il existe deux façons de tester le contrôleur:

  • Utilisation de l'environnement simulé
  • Utilisation du conteneur Servlet intégré (comme Tomcat ou Jetty)

Dans cet exemple, nous utiliserons un environnement simulé:

@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))); } }

Le test ci-dessus appelle le point de terminaison / entity / all et vérifie que la réponse JSON contient 4 éléments. Pour que ce test réussisse, nous devons également initialiser notre liste dans la classe du contrôleur:

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")); } //... }

Ce qui est important ici, c'est que l' annotation @WebAppConfiguration et MockMVC font partie du module de test de ressort , hasSize est un matcher Hamcrest et @Before est une annotation JUnit. Ceux-ci sont tous disponibles en important une de ces dépendances de démarrage.

4. Le Data JPA Starter

La plupart des applications Web ont une sorte de persistance - et c'est assez souvent JPA.

Au lieu de définir manuellement toutes les dépendances associées, allons plutôt avec le démarreur:

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

Notez que nous prenons en charge automatiquement au moins les bases de données suivantes: H2, Derby et Hsqldb. Dans notre exemple, nous utiliserons H2.

Créons maintenant le référentiel de notre entité:

public interface GenericEntityRepository extends JpaRepository {}

Il est temps de tester le code. Voici le 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()); } }

Nous n'avons pas passé de temps à spécifier le fournisseur de la base de données, la connexion URL et les informations d'identification. Aucune configuration supplémentaire n'est nécessaire car nous bénéficions des solides valeurs par défaut de Boot; mais bien sûr, tous ces détails peuvent toujours être configurés si nécessaire.

5. Le Mail Starter

Une tâche très courante dans le développement d'entreprise est l'envoi d'e-mails, et traiter directement avec l'API Java Mail peut généralement être difficile.

Spring Boot Starter cache cette complexité - les dépendances de messagerie peuvent être spécifiées de la manière suivante:

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

Maintenant, nous pouvons utiliser directement JavaMailSender , alors écrivons quelques tests.

Pour les besoins des tests, nous avons besoin d'un serveur SMTP simple. Dans cet exemple, nous utiliserons Wiser. Voici comment nous pouvons l'inclure dans notre POM:

 org.subethamail subethasmtp 3.1.7 test  

La dernière version de Wiser est disponible sur le référentiel central Maven.

Voici le code source du 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; } }

Dans le test, les méthodes @Before et @After sont chargées de démarrer et d'arrêter le serveur de messagerie.

Notez que nous câblons dans le bean JavaMailSender - le bean a été automatiquement créé par Spring Boot .

Tout comme toutes les autres valeurs par défaut dans Boot, les paramètres de messagerie de JavaMailSender peuvent être personnalisés dans application.properties :

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

Nous avons donc configuré le serveur de messagerie sur localhost: 25 et nous n'avons pas besoin d'authentification.

6. Conclusion

Dans cet article, nous avons donné un aperçu des Starters, expliqué pourquoi nous en avons besoin et fourni des exemples sur la façon de les utiliser dans vos projets.

Récapitulons les avantages de l'utilisation des démarreurs Spring Boot:

  • augmenter la gérabilité des pom
  • configurations de dépendances prêtes pour la production, testées et prises en charge
  • réduire le temps de configuration global du projet

La liste actuelle des démarreurs peut être trouvée ici. Le code source des exemples peut être trouvé ici.