Spring Boot

SpringBoot

Tutorial SpringBoot: Introducción a Spring Boot

Spring Boot introducción: primeros pasos. Aprende los conceptos básicos y da tus primeros pasos con Spring Boot con ejemplos detallados.

Aprende SpringBoot y certifícate

Qué es Spring Framework

Spring Framework es un marco de desarrollo de código abierto para la plataforma Java que proporciona una infraestructura completa para el desarrollo de aplicaciones empresariales.

Logo de Spring.

Creado por Rod Johnson y lanzado inicialmente en 2003, Spring surgió como una alternativa a los modelos de programación empresarial complejos que existían en ese momento, especialmente como respuesta a la complejidad de J2EE (Java 2 Enterprise Edition).

La filosofía central de Spring se basa en la simplicidad, la testabilidad y el bajo acoplamiento. El framework se construyó sobre el principio de inversión de control (IoC), que cambia la forma tradicional en que el código obtiene sus dependencias. En lugar de que los componentes creen o busquen sus dependencias, estas son "inyectadas" por un contenedor externo, lo que se conoce como inyección de dependencias (DI).

Spring Framework se organiza en diferentes módulos que pueden utilizarse de forma independiente o combinada según las necesidades del proyecto. Entre los módulos fundamentales se encuentran:

  • Spring Core: Proporciona la funcionalidad esencial del framework, incluyendo el contenedor IoC y el mecanismo de inyección de dependencias.
  • Spring AOP: Implementa la programación orientada a aspectos, permitiendo definir comportamientos transversales (como logging, seguridad o transacciones) de manera separada del código principal.
  • Spring JDBC: Ofrece una capa de abstracción sobre JDBC que simplifica el acceso a bases de datos relacionales y el manejo de excepciones.
  • Spring ORM: Proporciona integración con frameworks de mapeo objeto-relacional como Hibernate, JPA o MyBatis.
  • Spring Web: Incluye componentes para el desarrollo de aplicaciones web, como Spring MVC para la implementación del patrón Modelo-Vista-Controlador.
  • Spring Test: Facilita la escritura de pruebas unitarias e integración para aplicaciones Spring.

La arquitectura en capas es un concepto fundamental en Spring. Se promueve la separación de responsabilidades mediante capas bien definidas:

┌─────────────────────────────┐
│     Capa de Presentación    │ ← Controladores, vistas
├─────────────────────────────┤
│      Capa de Servicio       │ ← Lógica de negocio
├─────────────────────────────┤
│      Capa de Acceso a       │ ← Repositorios, DAOs
│          Datos              │
└─────────────────────────────┘

Una de las ventajas principales de Spring es que no impone un modelo de programación específico. Se puede integrar gradualmente en aplicaciones existentes, y permite utilizar POJOs (Plain Old Java Objects) simples en lugar de requerir que las clases implementen interfaces específicas del framework.

Spring Framework también proporciona soporte transaccional declarativo, permitiendo gestionar transacciones mediante anotaciones como @Transactional sin necesidad de código boilerplate para iniciar, confirmar o revertir transacciones.

El manejo de excepciones en Spring se simplifica mediante la conversión de excepciones específicas de tecnología (como SQLException) en excepciones más abstractas y significativas, lo que reduce el acoplamiento con tecnologías específicas.

Qué es Spring Boot y su evolución

Spring Boot es un proyecto dentro del ecosistema Spring que simplifica el desarrollo de aplicaciones basadas en Spring Framework. Lanzado en 2014, Spring Boot surgió como respuesta a la complejidad en la configuración y despliegue de aplicaciones Spring tradicionales.

La filosofía fundamental de Spring Boot se resume en su lema "opinionated defaults, graceful override" (configuraciones predeterminadas con opinión, anulación elegante). Esto significa que Spring Boot viene con configuraciones predeterminadas inteligentes basadas en las mejores prácticas, pero permite personalizarlas fácilmente cuando sea necesario.

Spring Boot introduce el concepto de aplicaciones autocontenidas que pueden ejecutarse de forma independiente, sin necesidad de servidores de aplicaciones externos. Esto se logra mediante la inclusión de un servidor embebido (como Tomcat, Jetty o Undertow) dentro del archivo JAR ejecutable de la aplicación.

La evolución de Spring Boot ha sido constante desde su lanzamiento inicial:

  • Spring Boot 1.0 (2014): Primera versión estable que introdujo los conceptos fundamentales como la autoconfiguración y las aplicaciones autocontenidas.
  • Spring Boot 1.5 (2017): Mejoró la integración con herramientas de monitorización y actuadores, además de refinar la experiencia del desarrollador.
  • Spring Boot 2.0 (2018): Un hito importante que adoptó Spring Framework 5, con soporte para Java 8+ como requisito mínimo e incorporó programación reactiva con Spring WebFlux.
  • Spring Boot 2.3 (2020): Introdujo características orientadas a contenedores y cloud-native, como la creación de imágenes Docker optimizadas y tiempos de inicio más rápidos.
  • Spring Boot 2.7 (2022): Refinó la experiencia del desarrollador con mejoras en la configuración y el rendimiento.
  • Spring Boot 3.0 (2022): Adoptó Jakarta EE en lugar de Java EE, requiere Java 17 como mínimo y se integra con Spring Framework 6, con mejoras en el rendimiento y la seguridad.

El sistema de autoconfiguración es un mecanismo que:

1. Detecta las dependencias presentes en el classpath
2. Configura automáticamente los componentes necesarios
3. Permite anular cualquier configuración automática cuando sea necesario

Por ejemplo, si se incluye la dependencia spring-boot-starter-data-jpa en el proyecto, Spring Boot configurará automáticamente un DataSource, un EntityManagerFactory y un TransactionManager sin necesidad de configuración adicional.

Los Spring Boot Starters son dependencias curadas que agrupan todas las bibliotecas necesarias para un propósito específico.

La configuración externalizada es otra característica clave. Spring Boot permite definir propiedades en varios lugares:

  • Archivos application.properties o application.yml
  • Variables de entorno
  • Argumentos de línea de comandos
  • Servicios de configuración centralizados
# application.yml
server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost/midb
    username: usuario
    password: contraseña

Los actuadores de Spring Boot proporcionan endpoints HTTP o JMX para monitorizar y gestionar la aplicación en producción. Estos exponen información valiosa como:

  • Estado de salud de la aplicación
  • Métricas de rendimiento
  • Información del entorno
  • Gestión de logs

Spring Boot también ha evolucionado para adaptarse a las arquitecturas modernas:

  • Microservicios: Con tamaño reducido y rápido inicio, las aplicaciones Spring Boot son ideales para arquitecturas de microservicios.
  • Aplicaciones cloud-native: Integración nativa con plataformas como Kubernetes y herramientas como Spring Cloud.
  • Aplicaciones reactivas: Soporte completo para programación reactiva con Spring WebFlux y Project Reactor.

El ecosistema alrededor de Spring Boot ha crecido con proyectos complementarios como:

  • Spring Cloud: Para desarrollo de sistemas distribuidos
  • Spring Security: Para seguridad y autenticación
  • Spring Data: Para acceso simplificado a diferentes tipos de bases de datos
  • Spring Batch: Para procesamiento por lotes

Qué diferencias hay entre Spring Framework y Spring Boot

Aunque Spring Boot está construido sobre Spring Framework, existen diferencias entre ambos que determinan cuándo y cómo utilizar cada uno.

Spring Framework requiere una configuración explícita y detallada, ya sea mediante XML, anotaciones o clases Java. Por ejemplo, para configurar una aplicación web MVC en Spring Framework tradicional se necesita:

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    // Múltiples métodos de configuración
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
    
    // Más configuraciones...
}

En contraste, Spring Boot adopta el principio de "convención sobre configuración", proporcionando valores predeterminados inteligentes que funcionan inmediatamente. La misma configuración web se realiza automáticamente al incluir la dependencia spring-boot-starter-web, sin código adicional.

La estructura del proyecto también difiere. En Spring Framework, se debe crear manualmente la estructura de directorios y configurar explícitamente componentes como el servidor web. Spring Boot, por su parte, proporciona una estructura de proyecto predefinida y servidores embebidos que simplifican el desarrollo.

El despliegue representa otra diferencia crucial. Las aplicaciones Spring Framework tradicionales generalmente se empaquetan como archivos WAR que deben desplegarse en servidores de aplicaciones externos como Tomcat o JBoss. Spring Boot, en cambio, permite crear aplicaciones autocontenidas con servidores embebidos:

// Aplicación Spring Boot lista para ejecutar
@SpringBootApplication
public class AplicacionEjemplo {
    public static void main(String[] args) {
        SpringApplication.run(AplicacionEjemplo.class, args);
    }
}

Esta aplicación puede ejecutarse con un simple comando java -jar sin infraestructura adicional.

La gestión de dependencias se aborda de manera diferente en ambos frameworks. Spring Framework requiere que el desarrollador identifique y gestione manualmente todas las dependencias necesarias, asegurando la compatibilidad entre versiones. Spring Boot introduce el concepto de "starters", que son dependencias curadas que agrupan bibliotecas compatibles para casos de uso específicos:

<!-- Un único starter que incluye múltiples dependencias compatibles -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Este starter incluye automáticamente Hibernate, Spring Data JPA, HikariCP y otras bibliotecas necesarias, todas en versiones compatibles entre sí.

La autoconfiguración es una característica exclusiva de Spring Boot que no existe en Spring Framework. Mientras que en Spring Framework cada componente debe configurarse explícitamente, Spring Boot analiza el classpath y configura automáticamente los componentes basándose en las dependencias presentes:

# Configuración mínima en application.properties para una base de datos
spring.datasource.url=jdbc:mysql://localhost/midb
spring.datasource.username=usuario
spring.datasource.password=clave

Con estas propiedades, Spring Boot configura automáticamente el DataSource, EntityManagerFactory, TransactionManager y otros componentes relacionados.

Las herramientas de desarrollo también difieren. Spring Boot proporciona características integradas como:

  • DevTools: Reinicio automático durante el desarrollo
  • Actuators: Endpoints para monitorización y gestión
  • Spring Boot CLI: Herramienta de línea de comandos para prototipado rápido

Estas herramientas no están disponibles en Spring Framework sin configuración adicional.

Spring Framework tiene una curva de aprendizaje más pronunciada debido a su naturaleza modular y la necesidad de comprender cómo integrar diferentes componentes. Spring Boot simplifica este proceso con configuraciones predeterminadas y documentación orientada a casos de uso específicos.

En cuanto a flexibilidad vs conveniencia, Spring Framework ofrece mayor flexibilidad y control sobre cada aspecto de la aplicación, pero requiere más conocimiento y esfuerzo. Spring Boot prioriza la conveniencia y la productividad, aunque puede resultar más difícil personalizar ciertos aspectos muy específicos.

El rendimiento inicial también varía. Las aplicaciones Spring Boot pueden tener un tiempo de arranque ligeramente mayor debido a la autoconfiguración y el escaneo de componentes, aunque las versiones recientes han mejorado en este aspecto.

La integración con microservicios es otra área de diferencia. Spring Boot está optimizado para el desarrollo de microservicios con su enfoque en aplicaciones autocontenidas, mientras que Spring Framework requiere configuración adicional para adaptarse a este paradigma.

En términos de producción y operaciones, Spring Boot incluye características integradas para entornos productivos:

  • Métricas y monitorización a través de Actuators
  • Configuración externalizada para diferentes entornos
  • Soporte para contenedores y plataformas cloud

Estas características deben implementarse manualmente en aplicaciones Spring Framework tradicionales.

La siguiente tabla resume las principales diferencias:

Aspecto Spring Framework Spring Boot
Configuración Explícita y detallada Automática con valores predeterminados
Despliegue WAR en servidores externos JAR autocontenido con servidor embebido
Dependencias Gestión manual Starters predefinidos
Desarrollo Más control, más código Mayor productividad, menos código
Casos de uso Aplicaciones con requisitos específicos Desarrollo rápido, microservicios

Spring Boot no reemplaza a Spring Framework, sino que lo complementa. Spring Boot utiliza Spring Framework como su base, simplificando su uso pero manteniendo toda su potencia. La elección entre uno u otro dependerá de los requisitos específicos del proyecto, las restricciones técnicas y las preferencias del equipo de desarrollo.

Aprende SpringBoot online

Otros ejercicios de programación de SpringBoot

Evalúa tus conocimientos de esta lección Introducción a Spring Boot con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de SpringBoot

Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Spring Boot

Spring Boot

Introducción Y Entorno

Spring Boot Starters

Spring Boot

Introducción Y Entorno

Inyección De Dependencias

Spring Boot

Introducción Y Entorno

Controladores Spring Mvc

Spring Boot

Spring Mvc Con Thymeleaf

Vista En Spring Mvc Con Thymeleaf

Spring Boot

Spring Mvc Con Thymeleaf

Controladores Spring Rest

Spring Boot

Spring Mvc Con Thymeleaf

Open Api Y Cómo Agregarlo En Spring Boot

Spring Boot

Spring Mvc Con Thymeleaf

Servicios En Spring

Spring Boot

Spring Mvc Con Thymeleaf

Clientes Resttemplate Y Restclient

Spring Boot

Spring Mvc Con Thymeleaf

Rxjava En Spring Web

Spring Boot

Spring Mvc Con Thymeleaf

Crear Entidades Jpa

Spring Boot

Spring Data Jpa

Asociaciones De Entidades Jpa

Spring Boot

Spring Data Jpa

Repositorios Spring Data

Spring Boot

Spring Data Jpa

Métodos Find En Repositorios

Spring Boot

Spring Data Jpa

Inserción De Datos

Spring Boot

Spring Data Jpa

Actualizar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Borrar Datos De Base De Datos

Spring Boot

Spring Data Jpa

Consultas Jpql Con @Query En Spring Data Jpa

Spring Boot

Spring Data Jpa

Api Query By Example (Qbe)

Spring Boot

Spring Data Jpa

Api Specification

Spring Boot

Spring Data Jpa

Repositorios Reactivos

Spring Boot

Spring Data Jpa

Testing Unitario De Componentes Y Servicios

Spring Boot

Testing Con Spring Test

Testing De Repositorios Spring Data Jpa

Spring Boot

Testing Con Spring Test

Testing Controladores Spring Mvc Con Thymeleaf

Spring Boot

Testing Con Spring Test

Testing Controladores Rest Con Json

Spring Boot

Testing Con Spring Test

Testing De Aplicaciones Reactivas Webflux

Spring Boot

Testing Con Spring Test

Testing De Seguridad Spring Security

Spring Boot

Testing Con Spring Test

Testing Con Apache Kafka

Spring Boot

Testing Con Spring Test

Introducción A Spring Security

Spring Boot

Seguridad Con Spring Security

Seguridad Basada En Formulario En Mvc Con Thymeleaf

Spring Boot

Seguridad Con Spring Security

Registro De Usuarios

Spring Boot

Seguridad Con Spring Security

Login De Usuarios

Spring Boot

Seguridad Con Spring Security

Verificar Token Jwt En Peticiones

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Spring Web

Spring Boot

Seguridad Con Spring Security

Seguridad Jwt En Api Rest Reactiva Spring Webflux

Spring Boot

Seguridad Con Spring Security

Autenticación Y Autorización Con Anotaciones

Spring Boot

Seguridad Con Spring Security

Introducción A Spring Webflux

Spring Boot

Reactividad Webflux

Spring Data R2dbc

Spring Boot

Reactividad Webflux

Controlador Rest Reactivo Basado En Anotaciones

Spring Boot

Reactividad Webflux

Controlador Rest Reactivo Funcional

Spring Boot

Reactividad Webflux

Operadores Reactivos Básicos

Spring Boot

Reactividad Webflux

Operadores Reactivos Avanzados

Spring Boot

Reactividad Webflux

Cliente Reactivo Webclient

Spring Boot

Reactividad Webflux

Introducción E Instalación De Apache Kafka

Spring Boot

Mensajería Asíncrona

Crear Proyecto Con Apache Kafka

Spring Boot

Mensajería Asíncrona

Creación De Producers

Spring Boot

Mensajería Asíncrona

Creación De Consumers

Spring Boot

Mensajería Asíncrona

Kafka Streams En Spring Boot

Spring Boot

Mensajería Asíncrona

Integración Con Angular

Spring Boot

Integración Frontend

Integración Con React

Spring Boot

Integración Frontend

Integración Con Vue

Spring Boot

Integración Frontend

Accede GRATIS a SpringBoot y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender el concepto y beneficios de la inversión de control (IoC).
  • Identificar los módulos principales de Spring y su funcionalidad.
  • Diferenciar entre configuración de Spring tradicional y Spring Boot.
  • Entender las capacidades de autoconfiguración de Spring Boot.
  • Analizar las diferencias entre Spring Framework y Spring Boot.
  • Aplicar estrategias de configuración y gestión de dependencias.
  • Evaluar el uso de Spring en entornos de microservicios y cloud-native.