Volver a la página principal
miércoles 2 octubre 2024
11

Cómo gestionar el ciclo de vida de los beans con @RequestScoped en Spring Boot

La anotación @RequestScoped en Spring Boot se utiliza para definir el alcance de un bean al nivel de una solicitud HTTP. Esto significa que el bean solo existirá durante la duración de una única petición. Este alcance es útil cuando necesitas que el estado de un bean se mantenga aislado para cada solicitud, como cuando se manejan datos específicos del usuario, sesiones cortas o información temporal.

¿Cómo funciona @RequestScoped en Spring Boot?

La anotación @RequestScoped proviene de la especificación de Contexts and Dependency Injection (CDI) en Java (javax.enterprise.context.RequestScoped) y se usa principalmente en aplicaciones Java EE. En Spring Boot, se puede utilizar con el soporte de CDI o usando la alternativa @Scope("request") del framework de Spring para definir un bean con el alcance de solicitud.

Cuando un bean se define como @RequestScoped, Spring crea una nueva instancia del bean para cada solicitud HTTP y la destruye cuando la solicitud finaliza. Esto garantiza que cada petición tenga su propio bean independiente, sin compartir datos entre diferentes solicitudes.

Configuración de @RequestScoped en Spring Boot

Para usar @RequestScoped en Spring Boot, se deben realizar algunas configuraciones adicionales, como asegurarse de que la aplicación está configurada con el soporte de CDI (spring-boot-starter-web y spring-boot-starter-data-cdi), o se puede optar por la anotación @Scope de Spring para lograr el mismo comportamiento.

Ejemplo de uso de @RequestScoped en Spring Boot

A continuación, se muestra un ejemplo de cómo usar @RequestScoped en un bean:

import javax.enterprise.context.RequestScoped;
import org.springframework.stereotype.Component;

@Component
@RequestScoped
public class MiBeanRequest {

    private String mensaje;

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }
}

Alternativa usando @Scope("request") de Spring

Si no se desea usar CDI, se puede emplear la anotación de Spring @Scope para definir el alcance de un bean:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("request")
public class MiBeanRequest {

    private String mensaje;

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }
}

Controlador que utiliza el bean con alcance de solicitud

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mensaje")
public class MensajeController {

    @Autowired
    private MiBeanRequest miBeanRequest;

    @GetMapping
    public String obtenerMensaje() {
        miBeanRequest.setMensaje("Mensaje único para esta solicitud.");
        return miBeanRequest.getMensaje();
    }
}

Explicación:

1. Bean MiBeanRequest:

  • Está anotado con @RequestScoped o @Scope("request"), lo que indica que su ciclo de vida se limita a la duración de una solicitud HTTP.

2. Controlador MensajeController:

  • Inyecta MiBeanRequest y establece un mensaje específico para cada solicitud usando setMensaje().
  • Al realizar una llamada a /mensaje, el mensaje será único para cada petición y no compartido entre diferentes solicitudes.

Referencia a la documentación oficial

Para más información, puedes consultar la documentación oficial de Spring.

Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer