Salta el contingut

Spring Framework

Spring és un marc de treball (framework) de codi obert per al desenvolupament d'aplicacions a la plataforma JVM. Va ser creat per abordar la complexitat del desenvolupament empresarial i és àmpliament adoptat a causa de les seves característiques, com ara:

  1. Inversió de Control (IoC): Spring maneja la creació i gestió d'objectes, la qual cosa redueix la dependència entre els components del programari.

  2. Programació Orientada a Aspectes (AOP): Spring proporciona un suport potent per a la programació orientada a aspectes, la qual cosa permet als desenvolupadors aplicar funcionalitats transversals de manera declarativa, com registre, seguretat, transaccions, etc.

  3. Integració de la base de dades: Spring proporciona una abstracció de la base de dades a través del seu mòdul JDBC i ORM, la qual cosa facilita la integració amb diferents bases de dades.

  4. Suport per a transaccions: Spring proporciona un mecanisme de gestió de transaccions que es pot integrar amb una varietat de tecnologies de persistència.

  5. Integració amb tecnologies de middleware: Spring s'integra bé amb tecnologies de middleware com JMS, EJB, etc.

  6. Suport per a proves: Spring proporciona suport per a proves unitàries i d'integració, la qual cosa ajuda els desenvolupadors a verificar el seu codi de manera més eficient.

Spring Boot

Spring Boot es un proyecto que se basa en el Spring Framework y simplifica el proceso de configuración y ejecución de aplicaciones Spring. Las características clave de Spring Boot incluyen:

  1. Autoconfiguración: Spring Boot puede configurar automáticamente una aplicación basada en las dependencias que se han agregado al proyecto.

  2. Standalone: Spring Boot permite crear aplicaciones independientes con un servidor embebido, lo que significa que no necesitas un servidor web o de aplicaciones separado.

  3. Opinión predefinida: Spring Boot tiene una opinión predefinida para configurar proyectos Spring, aunque permite a los desarrolladores modificar la configuración para satisfacer sus necesidades.

  4. Dependencias de inicio: Proporciona starters que son un conjunto de dependencias convenientes que simplifican la configuración de la aplicación.

  5. Actuator: Proporciona funcionalidades de producción listas para usar, como la monitorización y la gestión de la aplicación.

  6. Pruebas: Spring Boot proporciona soporte para pruebas con Spring Boot Test Starter, lo que facilita la escritura de pruebas para las aplicaciones Spring Boot.

Módulos principales de Spring

Spring Framework está diseñado de manera modular, lo que significa que puedes elegir usar solo los módulos que necesitas para tu aplicación. Aquí te describo algunos de los módulos más comunes:

  1. Spring Core: Este es el módulo central del framework Spring que proporciona la implementación fundamental de la Inversión de Control (IoC) y la Inyección de Dependencias (DI).

  2. Spring AOP: Este módulo proporciona soporte para la Programación Orientada a Aspectos (AOP), que permite a los desarrolladores definir métodos que se ejecutan antes, después o alrededor de los métodos de negocio.

  3. Spring DAO / Spring JDBC: Estos módulos proporcionan una capa de abstracción sobre las operaciones de bajo nivel de JDBC, lo que facilita el manejo de las operaciones de la base de datos.

  4. Spring ORM: Este módulo proporciona integración con tecnologías de mapeo objeto-relacional como Hibernate, JPA, JDO, etc.

  5. Spring Web MVC: Este módulo proporciona un marco para el desarrollo de aplicaciones web y RESTful utilizando el patrón Modelo-Vista-Controlador.

  6. Spring WebFlux: Este módulo es la respuesta de Spring al desarrollo de aplicaciones reactivas y permite la construcción de aplicaciones no bloqueantes.

Además de estos módulos, Spring tiene varios proyectos que extienden su funcionalidad:

  1. Spring Boot: Facilita la creación de aplicaciones Spring autónomas y basadas en la producción, simplificando la configuración y el despliegue.

  2. Spring Security: Es un marco de seguridad altamente personalizable que proporciona autenticación y autorización, protección contra ataques, etc.

  3. Spring Data: Simplifica la persistencia de datos y proporciona soporte para diferentes tecnologías de base de datos, incluyendo JPA, Hibernate, JDBC, MongoDB, Redis, etc.

  4. Spring Cloud: Proporciona herramientas para el desarrollo de aplicaciones en la nube, incluyendo la configuración centralizada, el descubrimiento de servicios, el enrutamiento, etc.

  5. Spring Integration: Proporciona una implementación del patrón de integración de sistemas empresariales (EIP) para facilitar la integración con otros sistemas mediante la mensajería.

  6. Spring Batch: Proporciona funciones robustas para el procesamiento por lotes, incluyendo servicios de transacción, tareas programadas, etc.

Cada uno de estos módulos y proyectos proporciona funcionalidad específica, lo que permite a los desarrolladores elegir y usar solo lo que necesitan para sus aplicaciones.

Beans

En Spring y Spring Boot, los Beans son los objetos fundamentales que forman la columna vertebral de tus aplicaciones. Son objetos que son instanciados, ensamblados y administrados por el contenedor Spring.

Los Beans son creados a partir de las clases de tu aplicación. Puedes configurar cómo se crean los beans, cómo se inyectan las dependencias y cómo se gestionan en el tiempo de vida de la aplicación.

La creación de beans se puede configurar de varias maneras en Spring:

  1. Anotaciones: Puedes usar anotaciones como @Component, @Service, @Repository y @Controller para marcar una clase como bean. Spring entonces automáticamente detectará estas clases y las registrará como beans en el contenedor.

@Service
public class MyService {
    //...
}
  1. Archivos de configuración XML: En aplicaciones Spring más antiguas, puedes definir beans en archivos de configuración XML. Sin embargo, este enfoque se utiliza con menos frecuencia en aplicaciones modernas.
<bean id="myService" class="com.example.MyService"/>
  1. Clases de configuración de Java: También puedes definir beans en clases de configuración de Java usando la anotación @Configuration y el método @Bean.
@Configuration
public class MyConfiguration {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

Una vez que los beans están en el contenedor Spring, puedes inyectarlos en otras partes de tu aplicación usando la anotación @Autowired. Spring se encargará de buscar el bean correcto y de inyectarlo en tu clase.

public class MyController {

    private final MyService myService;

    @Autowired
    public MyController(MyService myService) {
        this.myService = myService;
    }

    //...
}

En este ejemplo, Spring inyectará automáticamente el bean MyService en MyController cuando este último sea creado.

Los beans son útiles porque te permiten abstraer la creación y gestión de objetos. Esto hace que tu código sea más limpio, más fácil de probar y más modular. Además, los beans de Spring pueden tener ámbitos (como singleton, prototype, request, session, etc.) que te permiten controlar cuándo y cómo se crean y destruyen los beans.

Inversión de Control e Inyección de Dependencias

Inversión de Control (IoC) y Inyección de Dependencias (DI) son dos conceptos fundamentales en Spring y Spring Boot que facilitan la creación de aplicaciones modulares y flexibles.

Inversión de Control (IoC): IoC es un principio de diseño de software que invierte el control del flujo de la aplicación. En un programa tradicional, el flujo de control está dictado por el propio programa, lo que significa que el programa controla la creación y gestión de los objetos. Sin embargo, en un programa que utiliza IoC, este control se invierte, es decir, el framework (en este caso, Spring) se encarga de la creación y gestión de los objetos. Esto reduce el acoplamiento entre las clases y permite una mayor flexibilidad y modularidad.

Inyección de Dependencias (DI): DI es una técnica que implementa el principio de IoC para la gestión de dependencias entre objetos. En lugar de que los objetos creen o busquen sus dependencias, estas se "inyectan" en ellos por el framework. En Spring, esto se puede hacer a través de constructores, métodos setter o campos directamente. La DI facilita la prueba unitaria, ya que las dependencias pueden ser fácilmente sustituidas por mockups.

En Spring y Spring Boot, estos conceptos se implementan a través del contenedor Spring. El contenedor Spring crea y gestiona los objetos de la aplicación, que se conocen como beans. Los beans y sus dependencias se configuran en archivos de configuración XML o mediante anotaciones en el código.

Por ejemplo, si tienes una clase A que depende de una clase B, en lugar de crear un objeto B dentro de A con new B(), declaras esta dependencia y Spring se encarga de inyectarla. Esto se puede hacer mediante anotaciones como @Autowired.

public class A {
    private B b;

    @Autowired
    public A(B b) {
        this.b = b;
    }

    // resto de la clase
}

En este ejemplo, Spring creará un bean de B y lo inyectará en A cuando cree un bean de A. Esto significa que no tienes que preocuparte por la creación y gestión de B - eso es manejado por Spring, lo que es IoC y DI en acción.

Práctica de clase: Spring Boot

Investiga sobre proyectos servicios que conozcas que usen Spring Boot. ¿En qué parten lo usan? ¿Qué módulos de Spring usan? ¿Qué ventajas les da Spring Boot?