Spring nace de la complejidad que se tenía que hacer a la hora de crear proyectos java enterprise edition, los EJBeans eran muy complejos y la forma en que se realizaba el despliegue del proyecto era muy engorroso.
Spring Boot contiene una infraestructura ligera que elimina la mayor parte del trabajo de configurar las aplicaciones basadas en Spring. El objetivo de Spring Boot es proporcionar un conjunto de herramientas para construir rápidamente aplicaciones de Spring que sean fáciles de configurar.
Spring Boot es una tecnología que nos permite crear aplicaciones autocontenidas, con esto nos podemos olvidar de la arquitectura y enfocarnos únicamente en desarrollo, delegando a Spring Boot labores como configuración de dependencias, desplegar nuestro servicio o aplicación a un servidor de aplicaciones y enfocarnos únicamente en crear nuestro código.
Para esto Spring Boot utiliza internamente un servidor de aplicaciones embebido, por defecto utiliza Tomcat, pero también lo podemos hacer con jetty o undertow.
Y no solo esto, Spring Boot también nos provee un completo gestor de dependencias como maven o gradle, configuraciones automáticas y mucho más para que nuestro aplicación quede a la medida.
Spring Boot facilita la creación de aplicaciones independientes basadas en Spring de grado de producción que puede "simplemente ejecutar".
Existen tres pasos a realizar.
- Primero se crea un proyecto Maven/Gradle y se descargan las dependencias necesarias.
- En segundo lugar se desarrolla la aplicación.
- Tercero se despliega en un servidor.
Si nos ponemos a pensar un poco a detalle en el tema , únicamente el paso dos es una tarea de desarrollo. Los otros pasos están más orientados a infraestructura. No deberíamos tener que estar eligiendo continuamente las dependencias y el servidor de despliegue.
Básicamente, esto significa que es posible poner en funcionamiento una aplicación de Spring con muy poca configuración. La poca configuración que se necesita está en forma de anotaciones, y si se necesita, casi nada de XML.
Si bien es cierto que Spring Framework es muy potente, la configuración inicial y la preparación de las aplicaciones para producción son tareas bastante tediosas. Spring Boot simplifica el proceso al máximo gracias a sus dos principales mecanismos.
- Contenedor de aplicaciones integrado
Spring Boot permite compilar nuestras aplicaciones Web como un archivo .jar
que podemos ejecutar como una aplicación Java normal (como alternativa a un archivo.war
, que despliegaríamos en un servidor de aplicaciones como Tomcat).
Esto lo consigue integrando el servidor de aplicaciones en el propio .jar
y levantándose cuando arrancamos la aplicación. De esta forma, podemos distribuir nuestras aplicaciones de una forma mucho más sencilla, al poder configurar el servidor junto con la aplicación. Esto también es muy útil en arquitecturas de microservicios, puesto que permite distribuir nuestras aplicaciones como imágenes Docker.
- Starters
Spring Boot nos proporciona una serie de dependencias, llamadas starters, que podemos añadir a nuestro proyecto dependiendo de lo que necesitemos: crear un controlador REST, acceder a una base de datos usando JDBC, conectar con una cola de mensajes Apache ActiveMQ, etc.
Una vez añadimos un starter, éste nos proporciona todas las dependencias que necesitamos, tanto de Spring como de terceros. Además, los starters vienen configurados con valores por defecto, que pretenden minimizar la necesidad de configuración a la hora de desarrollar.
Un buen ejemplo es el de spring-boot-starter-actuator
: una vez que añadimos la dependencia, nuestra aplicación empezará a generar métricas tanto de la JVM como de la aplicación en sí (latencias, errores, etc).
Al igual que con Spring Framework, cualquier configuración puede ser modificada de ser necesario: desde el puerto en el que la aplicación escucha peticiones, hasta el banner que sale por consola al arrancar la aplicación.
Spring Initializr
El equipo de Spring creó la herramienta Spring Initializr una herramienta web intuitiva que nos permite autogenerar el esqueleto de la aplicación.
Se trata de un inicializador muy útil, ya que genera el pom.xml (o build.gradle), el main
de la aplicación, y un test que comprueba que la aplicación arranca correctamente.
Ya no se trata de elegir jar por JAR sino por tipo de aplicación que necesitamos. Por lo tanto en vez de tener que elegir 10 o 20 dependencias es mucho más cómodo elegir 2 starters y Spring Boot se encarga del resto.
Hola Mundo
A continuación vamos a realizar una pequeña aplicación, para demostrar como spring nos ahorra muchas configuraciones.
Esta es la estructura de la aplicación.
Esta es la clase principal
package com.hello.world;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WorldApplication {
public static void main(String[] args) {
SpringApplication.run(WorldApplication.class, args);
}
}
Esta es la clase que expone las peticiones Get.
package com.hello.world.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping
public String hello() {
return "Hello World - *** Spring Boot ***";
}
}
La anotación @RestController
indica que la clase será usada como manejadora de peticiones para servicios web tipo REST. Esto quiere decir que no regresará una página HTML como resultado, sino que este resultado será escrito directamente en el cuerpo de la respuesta.
La anotación @GetMapping
es una abreviación para @RequestMapping (method = RequestMethod.GET)
, esta nos sirve mapear la petición get en un url.
Para ver el resultado consultamos la url como se muestra a continuación.
Esto fue una breve aplicación que demuestra como es tan fácil desplegar una app con Spring Boot.