¿Qué son Spring framework y Spring Boot? Tu primer programa Java con este framework - VIDEO
Tags: java, spring, spanish, video
Published: 2020-10-08 09:39:25

---
title: ¿Qué son Spring framework y Spring Boot? Tu primer programa Java con este framework - VIDEO
published: true
date: 2020-03-31 08:00:00 UTC
tags: Java,Spring,Spanish,Video
canonical_url: https://www.campusmvp.es/recursos/post/que-son-spring-framework-y-spring-boot-tu-primer-programa-java-con-este-framework.aspx
cover_image: https://www.campusmvp.es/recursos/image.axd?picture=/2020/1T/spring-web.gif
---

>El autor de este artículo es **Rubén Pahíno** y fue originalmente publicado [en el blog de campusMVP](https://www.campusmvp.es/recursos/post/que-son-spring-framework-y-spring-boot-tu-primer-programa-java-con-este-framework.aspx).

Si desarrollas con Java, o lo has hecho en algún momento de los últimos años, seguramente te suene **Spring Framework** , aunque sea de oídas.

**[Spring Framework](https://spring.io/)** es un _framework_ Open Source que facilita la creación de aplicaciones de todo tipo en **Java** , **Kotlin** y **Groovy**.

Si bien es cierto que, por lo que es más conocido es por la inyección de dependencias, Spring Framework está dividido en diversos módulos que podemos utilizar, ofreciéndonos muchas más funcionalidades:

- **Core container** : proporciona inyección de dependencias e inversión de control.
- **Web** : nos permite crear controladores Web, tanto de vistas MVC como aplicaciones REST.
- **Acceso a datos** : abstracciones sobre JDBC, [ORMs](https://www.campusmvp.es/recursos/post/que-es-un-orm.aspx) como Hibernate, sistemas OXM (_Object XML Mappers_), JSM y transacciones.
- **Programación orientada a Aspectos (AOP)**: ofrece el soporte para [aspectos](https://docs.spring.io/spring/docs/4.3.15.RELEASE/spring-framework-reference/html/aop.html).
- **Instrumentación** : proporciona soporte para la instrumentación de clases.
- **Pruebas de código** : contiene un _framework_ de _testing_, con soporte para JUnit y TestNG y todo lo necesario para probar los mecanismos de Spring.

**Estos módulos son opcionales** , por lo que podemos utilizar los que necesitemos sin tener que llenar nuestro `classpath` con clases que no vamos a usar.

![Esquema que ilustra los diferentes módulos de Spring, obtenido de la documentación oficial](https://www.campusmvp.es/recursos/image.axd?picture=/2020/1T/modulos-spring.png)

## Razones para usar Spring

Aunque no sea una característica única de Spring, el uso de inyección de dependencias facilita la programación contra interfaz, permitiendo a los distintos componentes depender únicamente de interfaces y produciendo así un **código menos acoplado**. No solo eso, también permite implementar el patrón _singleton_ de una forma extremadamente sencilla (por defecto, las dependencias que inyectamos son singletons).

Hay cientos de tecnologías que Spring permite integrar. Desde bibliotecas que implementan [opentracing](https://opentracing.io/) hasta las que nos generan métricas para nuestra aplicación, pasando por serialización/deserialización a JSON y XML, seguridad con OAuth2 o programación reactiva entre otras.

En general, Spring **aumenta la productividad y reduce la fricción** al ofrecernos abstracciones sobre implementaciones de tecnologías concretas. Un ejemplo claro es el de `spring-data`, que nos permite definir el acceso a base de datos con interfaces Java. Esto lo consigue _parseando_ el nombre de los métodos y generando la consulta con la sintaxis específica para el _driver_ que utilicemos. Por ejemplo, cambiar nuestra aplicación de MySQL a PostgreSQL es tan sencillo como cambiar el _driver_: Spring se encarga de la sintaxis de forma transparente.

A pesar de "la magia de Spring" 🧙🏻‍♂️, como muchos lo llaman, Spring nos permite desactivar estos "comportamientos mágicos" en caso de ser necesario, por lo que **podemos tomar el control cuando necesitemos más granularidad**. Siguiendo con el ejemplo de `spring-data`, este control sería necesario si tenemos que realizar consultas mucho más complejas que un `SELECT * BY name`. En esos casos, entre otras opciones, podemos anotar nuestro método con `@Query` y escribir la consulta que deseemos. Ya no hay magia 😉

Por lo general, Spring no obliga a implementar ni extender nada, lo que nos permite escribir código que es "agnóstico" del _framework_. De esta forma, desarrolladores con cero o muy poco conocimiento de Spring pueden realizar su trabajo sin mayores complicaciones.

**Spring es de código abierto y tiene una gran comunidad detrás**. Si encuentras un _bug_, echas en falta una funcionalidad o lo que sea, siempre puedes [abrir un ticket](https://github.com/spring-projects/spring-framework/issues) o contribuir por tu cuenta.

## ¿Pero no íbamos a hablar de Spring Boot?

Hasta ahora he hablado de Spring Framework en general, pero el título de esta entrada menciona **Spring Boot** , así que voy a presentarlo.

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 desplegaríamos en un servidor de aplicaciones como Tomcat).

Esto lo consigue **integrando el servidor de aplicaciones en el propio `.jar`** y levantándolo 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 que podemos escalar horizontalmente (algo muy complicado con un `.war`).

> **Nota** : Spring boot **permite** distribuir tu aplicación como un `jar`, **no lo impone**. Si prefieres desplegar tu aplicación en un servidor de aplicaciones tradicional, Spring Boot te deja compilar el código como un `.war` que no incluya ningún servidor de aplicaciones integrado.

### 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.

## Hola Mundo con Spring Boot

Para demostrar lo fácil que es empezar a usar Spring Boot, vamos a ver el código necesario para crear nuestro primer "Hola mundo":

```
@SpringBootApplication
@RestController
public class Application {

    @GetMapping("/hello")
    public String hello() {
        return "Hello Bootiful!";
    }
}

```

Sencillo, ¿verdad?

Un poco más abajo te explico en un vídeo práctico cómo llegar a este código y qué significa.

## Bonus tip: Spring Initializr

![Captura de Spring Initializr](https://www.campusmvp.es/recursos/image.axd?picture=/2020/1T/spring-initializr.png)

El equipo de Spring también ha creado [Spring Initializr](https://start.spring.io/), una herramienta web que puedes utilizar para autogenerar el esqueleto de tu aplicación Spring Boot.

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.

## Vídeo práctico: "Hola Mundo" con Spring Boot

{% youtube UxMuZ-UPwrI %}