Articles

Spring Bean Scope | 5 Principales Tipos de Scope en Spring

¡Mantente actualizado con las últimas tendencias tecnológicas
¡Únete a DataFlair en Telegram!!

Objetivo

En el artículo anterior, aprendimos sobre la definición de Spring Bean. Hoy, conoceremos el alcance de los Spring Beans. Además, hablaremos de los diferentes tipos de Scopes en los Spring Beans. Cada uno de los ámbitos se definirá con ejemplos de trabajo utilizando Eclipse IDE. Además, llegaremos a saber cuándo usar un ámbito singleton y prototipo en Spring Framework.
Así que, vamos a empezar con el Ámbito de Spring Bean.

Alcance de los Spring Beans | 5 Principales Tipos de Alcance en Spring

Alcance de los Spring Beans | 5 Principales Tipos de Alcance en Spring

Alcance de los Spring Beans

Como sabéis el alcance del bean define el ciclo de vida y la visibilidad del bean en los contextos en los que se utiliza. Al definir un <bean> tienes la posibilidad de declarar el ámbito de ese bean de Spring en particular.
Exploremos las ventajas de Spring Framework con las limitaciones

Tipos de ámbito en Spring Bean

El Spring Framework tiene cinco tipos de ámbito que soporta. Estos son los siguientes:

a. Ámbito Singleton en Spring

Si el ámbito de Spring Bean se hace singleton entonces el contenedor IoC de Spring define sólo una instancia del objeto. Esa instancia se almacena en la caché de beans singleton. Además, todas las peticiones de ese nombre devolverán la misma instancia que se almacena en la caché. Junto con eso, cualquier modificación hecha a esa instancia se reflejará en todas las referencias a un bean de Spring.
Creemos una entidad Persona como sigue:

public class Person { private String name; // standard constructor, getters and setters}

Spring Beans con ámbito singleton:

@Bean@Scope("singleton")public Person personSingleton() { return new Person();}

Conoce la última tendencia de Job Roles y Salarios de Spring Framework
También puede ver dos objetos que hacen referencia a los mismos beans con los mismos valores:

private static final String NAME = "Sam";@Testpublic void givenSingletonScope_whenSetName_thenEqualNames() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("scopes.xml"); Person personSingletonA = (Person) applicationContext.getBean("personSingleton"); Person personSingletonB = (Person) applicationContext.getBean("personSingleton"); personSingletonA.setName(NAME); Assert.assertEquals(NAME, personSingletonB.getName()); ((AbstractApplicationContext) applicationContext).close();}

Los scopes.xml es el siguiente:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="org.example.scopes.Person" scope="singleton"/></beans>

b. Prototipo Scope en Spring

Esto hará que una definición de bean tenga cualquier número de instancias de objetos. Devolverá una instancia diferente cada vez que la solicitud provenga del contenedor IoC.
Lee sobre la configuración basada en Spring Java – Cómo configurar los beans de Spring
El prototipo se establece con la anotación @Scope en la definición del bean:

@Bean@Scope("prototype")public Person personPrototype() { return new Person();}

Verás la misma prueba que se hace para el scope de Spring Singleton que son dos objetos que solicitan el mismo nombre de bean:

private static final String NAME = "Sam";private static final String NAME_OTHER = "Hari";@Testpublic void givenPrototypeScope_whenSetNames_thenDifferentNames() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("scopes.xml"); Person personPrototypeA = (Person) applicationContext.getBean("personPrototype"); Person personPrototypeB = (Person) applicationContext.getBean("personPrototype"); personPrototypeA.setName(NAME); personPrototypeB.setName(NAME_OTHER); Assert.assertEquals(NAME, personPrototypeA.getName()); Assert.assertEquals(NAME_OTHER, personPrototypeB.getName()); ((AbstractApplicationContext) applicationContext).close();}

El scopes.xml se define como:

<bean class="org.example.scopes.Person" scope="prototype"/>

c. Ámbito de la solicitud en Spring

Esta solicitud tendrá como ámbito una definición de bean a la solicitud HTPP. Esto sólo existe en el contexto de la aplicación de Spring con conciencia web. Definirás el bean con el ámbito de la petición bajo la anotación @Scope:

@Bean@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator requestMessage() { return new HelloMessageGenerator();}

El atributo proxyMode es necesario ya que durante la instanciación del contexto de la aplicación web, no hay ninguna petición activa. El Spring Framework creará el proxy para la inyección como una dependencia.
A continuación, debes definir el controlador que tiene una referencia al bean requestMessage. Para ello, necesitas acceder a la misma petición más de una vez para probar los ámbitos específicos de la web.

@Controllerpublic class ScopesController { @Resource(name = "requestMessage") HelloMessageGenerator requestMessage; @RequestMapping("/scopes") public String getScopes(Model model) { requestMessage.setMessage("Good morning!"); model.addAttribute("requestMessage", requestMessage.getMessage()); return "scopesExample"; }}

d. Ámbito de sesión en Spring

De la misma manera, se pueden definir los beans dentro del ámbito de sesión como:

@Bean@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator sessionMessage() { return new HelloMessageGenerator();}

De la misma manera, se define el controlador con la referencia al bean sessionMessage. Para ello, es necesario ejecutar dos peticiones para que el valor del campo mensaje sea el mismo para la sesión.
Mira Gestión de transacciones en Spring – Tipos y métodos

@Controllerpublic class ScopesController { @Resource(name = "sessionMessage") HelloMessageGenerator sessionMessage; @RequestMapping("/scopes") public String getScopes(Model model) { sessionMessage.setMessage("Hello there!"); model.addAttribute("sessionMessage", sessionMessage.getMessage()); return "scopesExample"; }}

e. Global Session Scope in Spring

Este alcance de la definición del bean a la sesión HTTP global y sólo es válido para el contexto de aplicación web-aware de Spring. Este tipo se utiliza en aplicaciones de contenedores de portlet donde cada portlet tiene su sesión. Ahora verás el bean con ámbito globalSession bajo la anotación @Scope:

@Bean@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator globalSessionMessage() {return new HelloMessageGenerator();}

Así que esto ha sido todo sobre el Tutorial de Ámbito de Spring Bean. Espero que os guste nuestra explicación.

Conclusión

Por lo tanto, en esta sesión, hemos visto qué es Spring Bean Scope y cómo definir los ámbitos de los beans. Además, hemos hablado de los diferentes tipos de scopes en Spring Bean. También, hemos visto cada uno de los tipos de ámbitos definidos por separado con los ejemplos utilizando Eclipse IDE. Además, si tienes alguna duda respecto a Spring Bean Scope, no dudes en preguntar en la sección de comentarios.
Tema relacionado- Integración de MVC con Spring
Para referencia

Dejar una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *