Introducción a Spring Boot Starters

1. Información general

La gestión de la dependencia es un aspecto crítico de cualquier proyecto complejo. Y hacer esto manualmente es menos que ideal; cuanto más tiempo le dedique, menos tiempo tendrá en los otros aspectos importantes del proyecto.

Los arrancadores Spring Boot se crearon para abordar exactamente este problema. Los POM iniciales son un conjunto de descriptores de dependencia convenientes que puede incluir en su aplicación. Obtiene una ventanilla única para toda la tecnología Spring y relacionada que necesita, sin tener que buscar código de muestra y copiar y pegar un montón de descriptores de dependencia.

Tenemos más de 30 arrancadores de arranque disponibles; veamos algunos de ellos en las siguientes secciones.

2. Web Starter

Primero, veamos el desarrollo del servicio REST; podemos usar bibliotecas como Spring MVC, Tomcat y Jackson, muchas dependencias para una sola aplicación.

Los arrancadores de Spring Boot pueden ayudar a reducir la cantidad de dependencias agregadas manualmente simplemente agregando una dependencia. Entonces, en lugar de especificar manualmente las dependencias, simplemente agregue un iniciador como en el siguiente ejemplo:

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

Ahora podemos crear un controlador REST. En aras de la simplicidad, no usaremos la base de datos y nos centraremos en el controlador 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(); } }

El GenericEntity es un grano sencillo con Identificación de tipo largo y valor de tipo cadena .

Eso es todo: con la aplicación en ejecución, puede acceder a // localhost: 8080 / entity / all y verificar que el controlador esté funcionando.

Hemos creado una aplicación REST con una configuración bastante mínima.

3. El iniciador de la prueba

Para las pruebas, usualmente usamos el siguiente conjunto de bibliotecas: Spring Test, JUnit, Hamcrest y Mockito. Podemos incluir todas estas bibliotecas manualmente, pero Spring Boot starter se puede usar para incluir automáticamente estas bibliotecas de la siguiente manera:

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

Tenga en cuenta que no necesita especificar el número de versión de un artefacto. Spring Boot averiguará qué versión usar; todo lo que necesita especificar es la versión del artefacto spring-boot-starter-parent . Si más adelante necesita actualizar la biblioteca de arranque y las dependencias, simplemente actualice la versión de arranque en un solo lugar y se ocupará del resto.

De hecho, probemos el controlador que creamos en el ejemplo anterior.

Hay dos formas de probar el controlador:

  • Usando el entorno simulado
  • Usando el contenedor Servlet integrado (como Tomcat o Jetty)

En este ejemplo usaremos un entorno simulado:

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

La prueba anterior llama al punto final / entidad / todos y verifica que la respuesta JSON contiene 4 elementos. Para que esta prueba pase, también tenemos que inicializar nuestra lista en la clase del controlador:

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

Lo importante aquí es que la anotación @WebAppConfiguration y MockMVC son parte del módulo de prueba de primavera , hasSize es un comparador de Hamcrest y @Before es una anotación de JUnit. Todos estos están disponibles importando una de esta dependencia de inicio.

4. El iniciador Data JPA

La mayoría de las aplicaciones web tienen algún tipo de persistencia, y eso suele ser JPA.

En lugar de definir todas las dependencias asociadas manualmente, vayamos con el iniciador:

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

Tenga en cuenta que, de fábrica, tenemos soporte automático para al menos las siguientes bases de datos: H2, Derby y Hsqldb. En nuestro ejemplo, usaremos H2.

Ahora creemos el repositorio para nuestra entidad:

public interface GenericEntityRepository extends JpaRepository {}

Es hora de probar el código. Aquí está la prueba 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()); } }

No dedicamos tiempo a especificar el proveedor de la base de datos, la conexión URL y las credenciales. No es necesaria ninguna configuración adicional ya que nos beneficiamos de los sólidos valores predeterminados de arranque; pero, por supuesto, todos estos detalles aún se pueden configurar si es necesario.

5. El iniciador de correo

Una tarea muy común en el desarrollo empresarial es enviar correo electrónico y, por lo general, tratar directamente con la API de Java Mail puede ser difícil.

Spring Boot starter oculta esta complejidad: las dependencias de correo se pueden especificar de la siguiente manera:

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

Ahora podemos usar directamente JavaMailSender , así que escribamos algunas pruebas.

Para el propósito de la prueba, necesitamos un servidor SMTP simple. En este ejemplo, usaremos Wiser. Así es como podemos incluirlo en nuestro POM:

 org.subethamail subethasmtp 3.1.7 test  

La última versión de Wiser se puede encontrar en el repositorio central de Maven.

Aquí está el código fuente de la prueba:

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

En la prueba, los @Before y @After métodos son los encargados de iniciar y detener el servidor de correo.

Observe que estamos conectando el bean JavaMailSender ; Spring Boot creó el bean automáticamente .

Al igual que cualquier otro valor predeterminado en Boot, la configuración de correo electrónico para JavaMailSender se puede personalizar en application.properties :

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

Así que configuramos el servidor de correo en localhost: 25 y no requerimos autenticación.

6. Conclusión

En este artículo, brindamos una descripción general de los Starters, explicamos por qué los necesitamos y brindamos ejemplos sobre cómo usarlos en sus proyectos.

Recapitulemos los beneficios de usar arrancadores Spring Boot:

  • aumentar la manejabilidad del pom
  • Configuraciones de dependencia compatibles, probadas y listas para producción
  • Disminuir el tiempo total de configuración del proyecto.

La lista real de entrantes se puede encontrar aquí. El código fuente de los ejemplos se puede encontrar aquí.