Introducción a Spring Boot

Domina la Introducción a Spring Boot con esta guía completa para estudiantes. Aprende sobre Beans, Inyección de Dependencias y Component Scanning. ¡Empieza a desarrollar hoy!

La Introducción a Spring Boot es fundamental para cualquier estudiante o desarrollador que busque optimizar el desarrollo de aplicaciones Java. Spring Boot simplifica enormemente el proceso, permitiendo construir aplicaciones robustas con menos configuración y más rapidez. Este artículo explora los conceptos clave, desde qué es Spring Boot hasta cómo gestionar dependencias y la inyección de componentes.

¿Qué es Spring Boot y por qué es tan relevante?

Spring Framework es un pilar en el desarrollo de aplicaciones Java desde 2003, ofreciendo un Contenedor de Inversión de Control (IoC) y el patrón de Inyección de Dependencias. Con el tiempo, ha crecido en un vasto ecosistema de Spring Projects. Aquí es donde Spring Boot toma protagonismo.

Spring Boot, lanzado en 2014, surge para facilitar el desarrollo con Spring Framework, reduciendo la necesidad de archivos de configuración XML. Se basa en el principio de "Convención sobre Configuración", lo que significa que gran parte de los aspectos técnicos ya vienen preconfigurados.

Sus características principales incluyen:

  • Creación de aplicaciones stand-alone que se ejecutan desde el método main().
  • Servidor de aplicaciones embebido (Tomcat, Jetty o Undertow), eliminando la necesidad de despliegues externos.
  • Spring Boot Starters que simplifican la gestión de dependencias.
  • Configuración automática basada en las dependencias .jar del proyecto.
  • Funcionalidades avanzadas listas para producción, como métricas y chequeo de salud.
  • No genera código y no requiere configuración XML.
  • Se integra fluidamente con otras tecnologías.

Generación de proyectos con Spring Initializr

Spring Initializr es una herramienta esencial para iniciar un proyecto Spring Boot rápidamente. Permite generar la estructura básica y las dependencias iniciales con unos pocos pasos.

Se puede acceder a su versión online en start.spring.io, donde puedes:

  • Elegir el gestor de dependencias (Maven o Gradle).
  • Seleccionar el lenguaje de programación (Java, Kotlin o Groovy).
  • Definir la versión de Spring Boot, los metadatos del proyecto y el tipo de empaquetado (.jar o .war).
  • Seleccionar las dependencias iniciales necesarias.

Además, Spring Initializr está integrado en la mayoría de los IDEs, como Visual Studio Code o Eclipse. Por ejemplo, en VS Code con el Spring Boot Extension Pack, puedes usar CTRL + SHIFT + P y buscar Spring Initializr: Create a Maven Project... para guiarte en el proceso de creación.

Estructura de un Proyecto Web en Spring Boot

Un proyecto web generado con Spring Initializr (usando Maven y la dependencia Spring Web) presenta una estructura de archivos estándar. Los elementos más importantes son:

  • /pom.xml: El Project Object Model de Maven. Contiene la configuración del proyecto, sus dependencias y plugins.
  • /src/main/java/...: Aquí se aloja el código fuente Java (paquetes, clases e interfaces).
  • /src/main/resources/...: Contiene recursos como:
  • /static: Para recursos estáticos (imágenes, archivos .css, .js).
  • /templates: Plantillas para vistas MVC (ej. archivos .html con Thymeleaf).
  • /application.properties: Archivo de texto para definir propiedades clave-valor de la aplicación.

Gestión de Dependencias con Maven y Spring Boot Starters

Apache Maven es una herramienta clave para la construcción y gestión de proyectos Java. Utiliza el pom.xml para describir el proyecto y sus dependencias. Viene con objetivos predefinidos para compilar y empaquetar el código.

La gestión de dependencias es un aspecto crítico. Para simplificarla, Spring Boot introduce los Starters. Estos son descriptores de dependencias que se incluyen en el pom.xml y permiten añadir conjuntos de dependencias de tecnologías específicas, sin preocuparse por sus nombres o versiones individuales. Los Starters reducen significativamente el trabajo de configuración del pom.xml.

Spring Web MVC: Arquitectura para aplicaciones web

MVC (Model-View-Controller) es un estilo arquitectónico que organiza la aplicación en tres tipos de componentes:

  • Model: Clases que describen la estructura de datos, la lógica de negocio y el acceso a fuentes de datos.
  • View: Componentes que interactúan con el usuario, mostrando información y permitiendo la entrada de datos.
  • Controller: Clases que reciben solicitudes de usuario, procesan la información usando el modelo y deciden qué vista usar para mostrar el resultado.

Spring Web MVC es uno de los frameworks más populares para el desarrollo de aplicaciones web con este patrón. Para usarlo en Spring Boot, se incluyen las dependencias de los Starters Spring Web y Thymeleaf.

Este framework utiliza una variante de Front Controller, donde un DispatcherServlet recibe todas las solicitudes de los usuarios y las delega a controladores específicos. El DispatcherServlet gestiona un Servlet WebApplicationContext que contiene los controladores, un HandlerMapping para resolver URLs y un ViewResolver para obtener las vistas.

Spring Container y Spring Beans: El corazón de Spring

El Spring IoC Container es el núcleo de Spring Framework. Implementa el Principio de Inversión de Dependencias mediante la Inyección de Dependencias. Este contenedor se encarga de crear, conectar, configurar y gestionar el ciclo de vida de los objetos.

Los objetos gestionados por el Spring Container se conocen como Spring Beans. Puedes registrar tus beans de varias maneras:

  • Usando la annotation @Bean en métodos dentro de una clase de configuración que devuelven el bean.
  • Aplicando annotations de estereotipo del paquete org.springframework.stereotype a sus clases correspondientes:
  • @Component: Bean genérico.
  • @Repository: Bean de acceso a datos.
  • @Service: Bean que implementa lógica de negocio.
  • @Controller (o @RestController): Bean controlador MVC.
  • @Configuration: Bean de configuración.

Los beans declarados con estas annotations son detectados y registrados automáticamente mediante el Component Scanning. Puedes asignar un nombre identificador al bean usando el elemento value de la annotation (por defecto es el nombre de la clase con la inicial en minúscula).

Los Spring Beans deben tener constructores específicos:

  • Solo un constructor por defecto.
  • Varios constructores, uno de ellos marcado con @Autowired y que reciba beans registrados como parámetros.
  • Un solo constructor que reciba beans registrados como parámetros (a partir de Spring Framework 4.3, no necesita @Autowired).

Component Scanning: Descubrimiento automático de Beans

El Component Scanning es el proceso que autodetecta y registra como beans en el Spring Container los componentes marcados con annotations de estereotipo. Se habilita mediante la annotation @ComponentScan en una clase de configuración, especificando el paquete base donde buscar componentes.

En una aplicación Spring Boot, la clase principal con el método main() ya incorpora la annotation @SpringBootApplication, que es una combinación de @Configuration, @EnableAutoConfiguration y @ComponentScan. Esto simplifica la configuración inicial, permitiendo la detección automática de componentes sin configuración adicional.

Ámbito de los Spring Beans (Scope)

El ámbito o Scope de un Spring Bean define su ciclo de vida y visibilidad. Se configura con la annotation @Scope aplicada a la clase del bean o al método @Bean.

Spring Framework define los siguientes ámbitos:

  • singleton: (Por defecto) El Spring Container crea una única instancia compartida por todas las solicitudes.
  • prototype: Se crea una nueva instancia cada vez que se solicita el bean.

Para aplicaciones web, existen ámbitos adicionales:

  • request (o @RequestScope): Una instancia por cada solicitud web.
  • session (o @SessionScope): Una instancia por cada sesión de usuario web.
  • application (o @ApplicationScope): Una única instancia para el ciclo de vida del ServletContext.
  • websocket: Una instancia por cada sesión WebSocket.

Ciclo de vida de los Beans: @PostConstruct y @PreDestroy

Spring permite adjuntar comportamiento a la creación y destrucción de un bean usando annotations:

  • @PostConstruct: Invoca un método una vez, justo después de crear el bean e inicializar sus propiedades.
  • @PreDestroy: Invoca un método una vez, justo antes de que Spring destruya el bean.

Estos métodos pueden tener cualquier visibilidad (no final ni static), no deben recibir parámetros y deben ser void.

Clases de Configuración en Spring Boot

Antes de Spring Boot, gran parte de la configuración se hacía con archivos XML. Con Spring Boot, es posible realizar configuraciones usando clases de configuración y annotations.

Una clase de configuración es una clase marcada con @Configuration. Dentro de ella, se definen métodos con la annotation @Bean. Estos métodos son responsables de crear, configurar y devolver instancias de beans para que sean registrados en el Spring Container, aplicando así su configuración.

Inyección de Dependencias: Desacoplamiento y Gestión

La Inyección de Dependencias es una de las mayores ventajas del Spring Container. Permite que el contenedor provea instancias de otros beans donde sean necesarias, sin que el desarrollador tenga que preocuparse por su creación. Esto, combinado con interfaces, ayuda a desacoplar los componentes de la aplicación.

La annotation @Autowired se utiliza para solicitar al Spring Container la inyección de una dependencia en un atributo, un setter o un constructor de un bean.

Consideraciones importantes sobre la inyección de dependencias:

  • Si el contenedor no encuentra una dependencia, se lanza una NoSuchBeanDefinitionException.
  • Una dependencia puede declararse opcional con el elemento required de @Autowired (booleano).
  • Si hay ambigüedad al resolver una dependencia (múltiples beans del mismo tipo), se lanza NoUniqueBeanDefinitionException. Se puede resolver con @Qualifier (indicando el ID del bean) o @Primary (dando mayor prioridad a un bean).
  • @Primary también puede usarse en métodos @Bean de clases de configuración.
  • A partir de Spring Framework 4.3, @Autowired no es necesario en un constructor si es el único definido en la clase.

Consideraciones con el Ámbito en la Inyección de Dependencias

Se debe tener cuidado al inyectar un bean con un ámbito más reducido en uno con ámbito más amplio (ej. prototype en singleton), ya que el comportamiento podría no ser el esperado.

Inyectar un bean con ámbito de request o session en un bean singleton causará una UnsatisfiedDependencyException, ya que el objeto request no estará activo. En estos casos, se puede usar un proxy del bean, indicando proxyMode = ScopedProxyMode.TARGET_CLASS en @Scope. Las annotations @RequestScope y @SessionScope ya configuran proxyMode automáticamente.

Inyección de Valores: Personalizando aplicaciones

Es posible inyectar valores desde un archivo de propiedades, tanto en atributos de un bean como en parámetros de setter o constructores. Para esto se usa la annotation @Value.

En su elemento value, se indica el nombre de la propiedad a inyectar utilizando Spring Expression Language (SpEL). Por defecto, las propiedades se buscan en application.properties. Se pueden indicar otros archivos de propiedades usando @PropertySource en una clase de configuración, con la ruta del archivo como value.

Preguntas Frecuentes (FAQ)

¿Cuál es la diferencia principal entre Spring Framework y Spring Boot?

Spring Framework es la base, el contenedor IoC y el ecosistema de proyectos. Spring Boot es una herramienta construida sobre Spring Framework que simplifica el desarrollo, elimina la configuración XML, y provee auto-configuración y servidores embebidos para arrancar proyectos rápidamente y de forma más directa.

¿Por qué se utiliza Spring Initializr para crear un proyecto Spring Boot?

Spring Initializr es una herramienta que permite generar la estructura de un proyecto Spring Boot, seleccionar las dependencias necesarias y configurar aspectos básicos del proyecto de forma rápida y sencilla. Esto ahorra tiempo de configuración manual y asegura una base de proyecto consistente.

¿Qué son los Spring Boot Starters y por qué son importantes?

Los Spring Boot Starters son descriptores de dependencias que simplifican la configuración del archivo pom.xml de Maven (o build.gradle de Gradle). Permiten incluir conjuntos de dependencias de tecnologías específicas (como Spring Web o Spring Data) con una sola línea, sin tener que gestionar versiones y dependencias transitivas individualmente.

¿Cómo se detectan y registran los Spring Beans automáticamente?

Los Spring Beans se detectan y registran automáticamente a través del proceso de Component Scanning. Este proceso busca en los paquetes especificados (o en el paquete base de la aplicación Spring Boot) las clases marcadas con annotations de estereotipo como @Component, @Service, @Repository, @Controller, etc., y las registra en el Spring Container.

¿Qué es la Inyección de Dependencias en Spring y cómo ayuda al desarrollo?

La Inyección de Dependencias (DI) es un patrón implementado por el Spring Container donde el contenedor se encarga de proveer las instancias de los objetos (dependencias) a un bean, en lugar de que el bean las cree por sí mismo. Esto facilita el desacoplamiento de componentes, mejora la testabilidad del código y simplifica la gestión del ciclo de vida de los objetos.

Temas relacionados