Español

Spring framework 5 : Uso de los scopes (prototype y singleton) utilizando la anotación @Scope


El scope de un bean define su ciclo de vida, en los posts anteriores hemos creado beans pero no hemos definido su scope, al hacer esto Spring le asigna uno por defecto, a continuación se muestran los scopes disponibles:

ScopeDescripción
SingletonCrea una sola instancia del bean por contenedor de Spring
PrototypeCrea una nueva instancia cada vez que se solicita
RequestCrea una nueva instancia por cada petición HTTP,
solo se puede utilizar en una aplicación web
SessionCrea una nueva instancia por cada sesión HTTP
ApplicationCrea una nueva instancia por cada ServletContext

En este post nos enfocaremos en los scopes Singleton y Prototype.

Scope singleton

El scope singleton es el scope por defecto en spring, veamos el siguiente bean:

import org.springframework.stereotype.Component;

/**
 * @author raidentrance
 *
 */
@Component
public class SingletonScopeBean {
}

Ahora veamos la siguiente clase aplicación:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import com.devs4j.scopes.SingletonScopeBean;

@SpringBootApplication
public class SpringExampleApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringExampleApplication.class, args);

		SingletonScopeBean singletonBean = applicationContext.getBean(SingletonScopeBean.class);

		SingletonScopeBean secondSingletonBean = applicationContext.getBean(SingletonScopeBean.class);

		System.out.println(singletonBean.equals(secondSingletonBean));
	}

}

La salida será la siguiente:

true

Podemos ver que tenemos 2 beans singletonBean y secondSingletonBean y al llamar el método equals la salida es true, indicando que es el mismo objeto.

Scope prototype

El scope prototype indica que se creará un bean nuevo cada que se mande llamar, por esto re utilizaremos el bean anterior y solo cambiaremos su scope como se muestra a continuación:

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

@Component
@Scope("prototype")
public class PrototypeScopeBean {

}

Re utilizaremos la clase aplicación:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import com.devs4j.scopes.PrototypeScopeBean;

@SpringBootApplication
public class SpringExampleApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext applicationContext = SpringApplication.run(SpringExampleApplication.class, args);

		PrototypeScopeBean prototypeBean = applicationContext.getBean(PrototypeScopeBean.class);

		PrototypeScopeBean secondPrototypeBean = applicationContext.getBean(PrototypeScopeBean.class);

		System.out.println(prototypeBean.equals(secondPrototypeBean));
	}

}

La salida será la siguiente:

false

Esto se debe a que cada vez que se mande llamar el método getBean se creará un bean nuevo, es por esto que al mandar llamar al método equals el resultado será false.

Para estar al pendiente sobre nuestro contenido nuevo síguenos en nuestras redes sociales https://www.facebook.com/devs4j/ y https://twitter.com/devs4j.

Autor: Alejandro Agapito Bautista
Twitter: @raidentrance
Contacto:raidentrance@gmail.com

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s