Tutorial Spring Boot – Creando nuestra primera aplicación

reset css

En este tutorial vamos a ver lo rápido y sencillo que es crear un proyecto utilizando Spring Boot, ya que no nos vamos a tener que preocupar de gestionar las dependencias que necesitaremos (al menos las más comunes), ni hacer las típicas configuraciones iniciales que hacemos al empezar un proyecto de Spring y ni tan siquiera nos vamos a tener que preocupar de configurar un servidor para correr nuestra aplicación. Vamos que nos permite centrarnos en el desarrollo gracias a todas las cosas que Spring Boot hace por nosotros y que nos van a permitir crear y desplegar nuestras aplicaciones de una forma muy sencilla.

El proyecto que vamos a crear en este tutorial lo voy a usar de base para ir entrando más en profundidad en posteriores post tanto en Spring Boot como en otros temas relacionados de forma que la idea es tener al final una aplicación sencilla pero que nos permita tener una visión completa de Spring, por eso en este post nos vamos a centrar en cómo crear nuestra primera aplicación con Spring Boot, analizar su estructura, explicar los puntos básicos y arrancarla, ni más ni menos.

1. Crear un proyecto con Spring Boot

Vamos a ver cómo crear un proyecto con Spring Boot desde 0 usando el String Tool Suite que es un entorno de desarrollo basado en eclipse con todo lo que necesitamos para hacer desarrollos con Spring o bien podemos usar un eclipse «normal» y instalarle el Spring Tools desde el Eclipse Marketplace, podríamos usar el IDE que más nos guste pero alguno había que elegir para hacer el tutorial…

Para crear un proyecto nuevo proyecto de Spring nos vamos a File/New/Spring Starter Proyect, si no aparece elegimos Proyect… y lo buscamos dentro de Spring Boot y siguiente.

Crear nuevo proyecto con Spring Boot

En esta primera pantalla podemos decidir si queremos usar maven o gradle, la versión de java que queremos usar, la forma en la que queremos que se empaquete el proyecto, el lenguaje de programación que vamos a usar y los típicos datos del proyecto, nombre, package, …

Ponemos los datos del proyecto y nos quedamos con maven, con la última versión de la jdk, nos vamos a quedar también con el jar porque no necesitamos otra cosa y como lenguaje pues elegimos Java aunque quizás algún día me anime a hacerlo también con Kotlin.

Pulsamos en Next > para que nos aparezca la pantalla para seleccionar las dependencias que sabemos que va a utilizar nuestro proyecto.

Seleccionar dependencias nuevo proyecto Spring Boot

Las buscamos y las seleccionamos y cuando tengamos todas las que necesitamos le damos a Finish, si se nos olvida alguna no pasa nada, siempre podremos incluirlas a mano en el pom.xml pero desde aquí es más simple porque con unos clics ya tenemos configuradas todas las dependencias sin necesidad de estar copiándolas de otros proyectos que tengamos o peor de estar buscándolas una a una.

Y así de fácil tenemos nuestro proyecto listo para empezar.

2. Estructura del proyecto

La estructura del proyecto va a depender de las elecciones que hiciésemos a la hora de crear el proyecto, por ejemplo, si hubiésemos elegido empaquetarlo como .war tendríamos la carpeta webapp y si además quitásemos Thymeleaf y lo seguimos dejando como un proyecto web tendríamos una clase adicional (ServletInitializer), pero básicamente podemos decir que la estructura del proyecto será la típica de un proyecto de Spring.

Estructura de proyecto Spring Boot

Dentro de nuestro package principal tenemos una clase con el nombre del proyecto + Application que es la que nos proporciona Spring Boot para arrancar nuestra aplicación.


package com.programandoointentandolo.tsb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TutorialSpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(TutorialSpringBootApplication.class, args);
    }
}

Como vemos esta clase es muy sencilla ya que solo contiene el método main dentro del que se llama a SpringApplication.run() y una anotación @SpringBootApplication que es equivalente a usar las anotaciones @Configuration, @EnableAutoConfiguration y @ComponentScan con sus configuraciones por defecto.

  • @Configuration: Esta anotación se utiliza para indicar que la clase puede contener beans que serán registrados al iniciar la aplicación.
  • @EnableAutoConfiguration: Con esta anotación se le indica a Spring que se encargue de configurar todas las dependencias que tengamos en el proyecto.
  • @ComponentScan: Permite que se escaneen todos los @Component que se encuentre dentro del paquete en el que se define, se puede configurar para que busque en los paquetes que queramos.

El siguiente archivo que vemos en el proyecto es el application.properties que es el archivo que utilizaremos para configurar nuestra aplicación, por lo tanto aquí es donde vamos a configurar nuestra conexión de base de datos y el resto de configuraciones que necesitemos, porque aunque Spring Boot nos evita tener que indicar todas las típicas configuraciones en las que solo nos limitaríamos a dejar los valores por defecto siempre existe la posibilidad de que necesitemos cambiarlas, o simplemente como en el caso de las referentes a la base de datos que no tengamos más remedio que indicarlas manualmente. En este enlace de la documentación pues revisar las propiedades más comunes.

Para nuestro ejemplo vamos a usar una base de datos MySql y como durante el tutorial es muy probable que nuestras clases cambien y nos obliguen a cambiar nuestro modelo de BD vamos a dejar que Spring Boot nos cree las tablas a partir de nuestras clases cuando arranquemos la aplicación y que las borre cuando la paremos para poder centrarnos en lo que estamos haciendo y no tener que preocuparnos por dejar datos inconsistentes.

Por lo que nuestro application.properties será el siguiente ya que la BD se va a llamar pruebas, va a estar en localhost:8889 y tanto el usuario como la password van a ser root.


aplicacion.nombre=Tutorial Spring Boot
server.port=9876
spring.datasource.url=jdbc:mysql://localhost:8889/pruebas?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect
spring.jpa.hibernate.ddl-auto=create-drop
logging.level.org.hibernate.SQL=debug

Esas 3 propiedades son las que es posible que tengas que cambiar para poder usar tu BD, en cuanto al resto he puesto una propiedad inventada aplicacion.nombre para que se vea que también es posible indicar nuestras propias variables de configuración, con server.port podemos indicar el puerto en el que se arrancará la aplicación por si no nos gusta el puerto por defecto, luego tenemos las propiedades referentes a la conexión de BD y la que hace nuestra base de datos se limpie con cada ejecución spring.jpa.hibernate.ddl-auto=create-drop.

Los archivos .properties son sencillos sobre todo cuando son pequeños pero si crecen un poco y se van metiendo las propiedades desordenadas pueden ser dificiles de leer, por eso vamos a sustituir el application.properties que Spring Boot nos ha creado por un application.yml porque Spring Boot soporta también el formato YAML perfectamente y el resultado es más legible.

A continuación tenemos el .yml correspondiente al application.properties anterior.


aplicacion:
  nombre: Tutorial Spring Boot
   
server:
  port: 9876
  
spring:
  datasource:
    url: jdbc:mysql://localhost:8889/pruebas?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    database-platform: org.hibernate.dialect.MySQL57Dialect
    hibernate:
      ddl-auto: create-drop
      
logging:
  level:
    org:
      hibernate:
        SQL: debug

Comparando uno y otro vemos que las propiedades son las mismas y lo que cambia es su representación, mientras que en el .yml se sigue una estructura de árbol en el .properties cada propiedad contiene toda su ruta completa, y si nos fijamos vemos que el .yml lo que hace es que sustituye el «.» de separación del .properties por «:» y comienza una nueva rama y así sucesivamente hasta que llega al nombre de la propiedad donde ya si que indica su valor.

A Spring Boot le da igual que usemos uno u otro formato y no vamos a tener que hacer ningún tipo de configuración adicional para que use el application.yml, en cualquier caso lo que hará cuando vaya a arrancar la aplicación será leer nuestro application.yml o application.properties para inyectar los valores de las propiedades que definamos en las clases de configuración correspondientes para que se arranque correctamente configurada.

El último archivo que nos queda por ver es el test que nos crea que como es natural esta vacío… pero ya vemos que tiene 2 anotaciones, @RunWith(SpringRunner.class) para que el tets use el runner de Spring y @SpringBootTest que lo que hace es buscar la clase anotada con @SpringBootApplication y usarla para cargar el contexto completo de la aplicación para hacer el test por lo que por lo general no vamos a usarla ya que normalmente no vamos a necesitar cargar toda la aplicación a no ser que queramos hacer una prueba completa de todas las capas de muestra aplicación.


package com.programandoointentandolo.tsb;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TutorialSpringBootApplicationTests {

    @Test
    public void contextLoads() {
    }

}

Pero como no todo puede ser perfecto si estamos usando en nuestro proyecto una jdk posterior a la 8 como en nuestro caso que estamos usando la 10 e intentamos ejecutar el test nos va a saltar una excepción, para solucionarlo solo tenemos que añadir una demencia al pom.xml, porque esta librería ya no está incluida dentro de la jdk, bueno en realidad si lo sigue estando hasta la próxima versión pero para que nos funcione tendríamos que añadir el comando –add-modules java.xml.bind pero no es una solución muy limpia y menos sabiendo que con la siguiente versión ya no nos va a funcionar.


<dependency>
  <groupId>javax.xml.bind</groupId>
  <artifactId>jaxb-api</artifactId>
  <version>2.3.0</version>
</dependency> 

3. Arrancando nuestro ejemplo con Spring Boot

Una vez que ya tenemos el proyecto creado y hemos echado un vistazo a lo que nos vamos a encontrar los proyectos de Spring Boot ya estamos listos para crear un proyecto sencillo y probar nuestra primera aplicación usando Spring Boot.

Para no alargar esto innecesariamente no voy a incluir aquí el código de los controllers, services, … ya que no es el propósito de este post y ya lo iremos viendo y desarrollando más en profundidad de forma separada para que sea más fácil de seguir.

Bueno, pues vamos a ver como probar nuestra aplicación, para arrancarla desde nuestro IDE podemos hacer click derecho sobre nuestro proyecto y después elegimos Run As y Spring Boot App.

Arrancar aplicacion Spring Boot

También podemos hacerlo desde el Boot Dashboard, que es una vista muy similar a Servers pero en este caso para las aplicaciones de Spring Boot

Vista Boot Dashboard

Abrimos la url en nuestro navegador y voila, ya tenemos nuestra aplicación funcionando.

Aplicacion Spring Boot + Thymeleaf + Bootstrap

Desplegar nuestra aplicación desde el STS es fácil, pero ¿y desplegarla sin él? pues la verdad es que es increíblemente fácil, solo tenemos que coger el jar que se habrá generado en la carpeta target del proyecto y ejecutarlo con java -jar tutorial-spring-boot-0.0.1-SNAPSHOT.jar y aplicación desplegada.

Arrancando aplicacion Spring Boot desde la consola

El código completo del de este ejemplo esta en mi repositorio de github tutorial-spring-boot pero como el proyecto va a ir evolucionando a medida que vayamos viendo más cosas puede que el código no sea exactamente el mismo, pero para eso con cada nuevo post creare una release para que se pueda consultar como se encontraba el proyecto en ese momento y sea sencillo encontrar el estado correspondiente o para descargar directamente el código correspondiente al post, el enlace correspondiente a esta release esta aquí.