Tipos de Scope Bean en Spring
En esta nueva entrada vamos a ver un poco de teoría de Spring y a ver los diferentes tipos de Scope Bean en Spring.
El scope de un bean, define el ciclo de vida así como la visibilidad de un bean en el contexto en el que lo vamos a usar, atendiendo a esta definición podemos encontrar los siguientes tipos:
- singleton
- prototype
- request
- session
- application
- websocket
A continuación vamos a definir los diferentes scopes.
Scope Singleton en Spring
Este es el scope por defecto en Spring. Funciona de manera que todas las peticiones que se hagan a ese bean siempre devuelven el mismo objeto, el cual se encuentra cacheado.
Para crear un bean de tipo singleton podemos no indicar nada en la creación del bean, con lo que Spring asocia que es de tipo Singleton, o definirlo de las siguientes maneras:
Por ejemplo para un objeto coche (car):
@Getter @Setter public class Car { private String model; }
Ahora que hemos definido el objeto vamos a definir el bean y a crearlo de tipo singleton:
@Bean @Scope("singleton") public Car car() { return new Car(); }
O también lo podemos definir de la siguiente manera:
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
Scope Prototype en Spring
En el caso en el que nuestro bean sea Prototype el contenedor de Inversión de Control de Spring creará una nueva instancia del objeto cada vez que se realize una petición para ese bean . Por lo general vamos a usar el Scope Prototype de Spring cuando cuando deseamos mantener estado.
Al igual que el Scope Singleton podemos definirlos de la siguiente manera:
@Bean @Scope("prototype") public Car car() { return new Car(); }
Y también podemos definirlo así:
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
Scope Request en Spring
Scope Request es un tipo de Scope Bean en Spring, que crea un nuevo bean por cada petición HTTP que se realize. Este tipo de bean puede ser utilizado para temas de autenticación y autorización.
Este tipo de bean es definido de manera diferente a los anteriores para ello lo definimos de la siguiente manera:
@Bean @Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public Car car() { return new Car(); }
En la anterior definición del bean hemos añadido el atributo proxyMode ya que será necesaria en el momento en el que se instancie el contexto de la aplicación y no hay activo ninguna petición.
También puede ser definido con una única anotación:
@Bean @RequestScope public Car car() { return new Car(); }
Scope Session en Spring
El Scope Session a diferencia del request, creará un único bean para la sessión de HTTP.
La manera de crear este tipo de bean es muy similiar a la de Request.
@Bean @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public Car car() { return new Car(); }
También podemos crearlo haciendo uso de la anotación específica que existe para este tipo de bean:
@Bean @SessionScope public Car car() { return new Car(); }
Scope Application en Spring
Este tipo de Scope Bean va a crear un bean para todo el ciclo de vida del ServletContext. Es decir, crea una instancia por el tiempo de ejecución de la aplicación.
Este Scope es parecido al Scope Singleton pero tiene una diferencia, el singleton tienen un alcanze únicamente a un ApplicationContext, mientrás que el Application es un scope de tipo singleton pero para ServletContext.
@Bean @Scope( value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS) public Car car() { return new Car(); }
Al igual que sucede con el request y el session, el Scope Application tiene su propia anotación:
@Bean @ApplicationScope public Car car() { return new Car(); }
Scope WebSocket en Spring
El tipo de Scope WebSocket es un tipo especial en el que el bean que se crea dura durante la sesión del WebSocket.
Este tipo se Scope es usado para crear aplicaciones con WebSocket, para intercambio de mensajes por ejemplo, de manera bidireccional entre cliente y servidor. Este tipo de Scope vivirá mientras la sesión del WebSocket este viva.
@Bean @Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS) public Car car() { return new Car(); }
Conclusión
En esta entrada hemos visto los diferentes tipos de Scope Bean en Spring, para poder entender mejor como funcionan y poder aplicarlos en diferentes momentos.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!
No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.