El contenedor de Spring no sólo instanciará un bean y cableará sus dependencias, sino que también proporcionará el ámbito de una instancia. Hay soporte incorporado para seis ámbitos de bean en Spring Framework. Por ejemplo, el ámbito de un bean puede ser singleton, prototipo, etc. Este post muestra cómo establecer un ámbito de bean usando la anotación Spring @Scope.
Ámbitos de bean de Spring soportados
- Ámbito singleton- Se crea una instancia de objeto única correspondiente a una definición de bean para cada contenedor Spring IoC. El ámbito Singleton es un ámbito de bean por defecto.
- Ámbito Prototipo- Se crea una nueva instancia de objeto cada vez que se solicita el bean desde el contenedor de Spring.
- Ámbito Solicitud- Para cada solicitud HTTP se crea una nueva instancia de bean. Este ámbito del bean de Spring sólo es válido en el contexto de un Spring ApplicationContext con conciencia web.
- Ámbito de la sesión- Una sola instancia del bean tiene como ámbito el ciclo de vida de una sesión HTTP. Este ámbito sólo es válido en el contexto de un Spring ApplicationContext compatible con la web.
- Ámbito de aplicación: asigna una definición de bean única al ciclo de vida de un ServletContext. Este ámbito sólo es válido en el contexto de un Spring ApplicationContext compatible con la web.
- Ámbito de Websocket: abarca una única definición de bean para el ciclo de vida de un WebSocket. Este ámbito sólo es válido en el contexto de un Spring ApplicationContext compatible con la web.
Dónde utilizar la anotación @Scope
La anotación @Scope puede utilizarse como una anotación a nivel de tipo junto con las anotaciones @Component y @Configuration. Cuando se utiliza como una anotación a nivel de tipo, @Scope indica el nombre de un ámbito de aplicación a utilizar para las instancias del tipo anotado.
La anotación @Scope también se puede utilizar como una anotación a nivel de método junto con @Bean. Cuando se utiliza como una anotación a nivel de método @Scope indica el nombre de un ámbito a utilizar para la instancia devuelta por el método.
Anotación @Scope con diferentes ámbitos
En esta sección veremos fragmentos de código del uso de la anotación @Scope con diferentes ámbitos de bean. Los ámbitos proporcionados fuera de la caja en Spring pueden ser referidos usando las constantes SCOPE_* disponibles en las interfaces ConfigurableBeanFactory y WebApplicationContext.
@Scope con el ámbito del bean Singleton
@Service@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public class BeanService{ ... ...}
@Scope con el ámbito del bean Prototype
@Service@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class BeanService{ ... ...}
@Scope con Request bean scope
@Service@Scope(WebApplicationContext.SCOPE_REQUEST)public class BeanService{ ... ...}
@Scope con Session bean scope
@Service@Scope(WebApplicationContext.SCOPE_SESSION)public class BeanService{ ... ...}
@Scope con el ámbito del bean Application
@Service@Scope(WebApplicationContext.SCOPE_APPLICATION)public class BeanService{ ... ...}
@Scope con el ámbito del bean WebSocket
@Component@Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)public class MyBean { ... ...}
Anotación Spring @Scope Ejemplo de Singleton
Definir un bean con ámbito singleton significa que una sola instancia de ese bean es creada por el contenedor. Todas las peticiones de ese bean devolverán el mismo objeto y cualquier modificación en el campo se reflejará en todas las referencias al bean ya que todas las referencias apuntan al mismo objeto.
El ámbito del singleton es el ámbito por defecto del bean si no se especifica explícitamente ningún ámbito.
Tenemos una clase User con campos como firstName, lastName y age. La clase está anotada con la anotación @Scope con el alcance especificado como singleton.
Clase de configuración de la aplicación para especificar el escaneo del componente.
@Configuration@ComponentScan("com.knpcode.springexample")public class AppConfig {}
Ahora bien, si se ejecuta este ejemplo y se obtienen dos objetos del bean User desde el contenedor, ambos objetos de referencia apuntarán al mismo bean ya que el alcance es singleton.
Salida
First Name- RayLast Name- Chandler
Como puedes ver firstName y lastName se establecen usando la referencia user1, obteniendo e imprimiendo los valores de estos campos desde la referencia user2 también dan los mismos valores.
Anotación Spring @Scope Ejemplo de Prototipo
En la clase User como se ha mostrado anteriormente si se cambia el scope a Prototype.
Ejecute el ejemplo ahora y analice la salida.
First Name- nullLast Name- null
Los campos siguen siendo nulos para la instancia user2 ya que ahora se crea una instancia independiente debido al scope del prototipo.
Anotación @Scope de Spring con @Configuration
En el ejemplo anterior se utiliza @Scope junto con @Component, veamos un ejemplo en el que se utiliza @Scope con las anotaciones @Configuration y @Bean.
Aquí tenemos dos clases cuyas instancias serán devueltas desde los métodos anotados con métodos @Bean.
public class MyBean {public void myMethod() {System.out.println("In MyMethod of MyBean class");}}
public class ClassB {public ClassB(){System.out.println("In constructor of ClassB");}}
Clase config
En la clase config se utiliza @Scope tanto como anotación a nivel de tipo como a nivel de método. En el nivel de tipo (junto con @Configuration) se especifica scope como prototipo.
En el nivel de método con un método no se especifica scope lo que significa que el bean tendrá nivel por defecto Singleton. Tenga en cuenta que el alcance especificado en el nivel de tipo no es aplicable al nivel de método automáticamente, los métodos tendrán su propio alcance. Otro método tiene el ámbito Prototype.
Podemos comprobar los ámbitos del bean obteniendo la instancia BeanDefinition que tiene los métodos isSingleton e isPrototype.
Salida
AppConfig has prototype scope- trueMyBean has prototype scope- falseMyBean has singleton scope- trueClassB has prototype scope- true
Desde la salida se puede ver que el ámbito del bean AppConfig es prototype, que es lo que definimos a nivel de tipo.
El ámbito de la instancia de MyBean es Singleton que se asigna por defecto. El alcance para la instancia de ClassB es prototype, tal y como se ha definido a nivel de método en la clase Config.
- Anotación @PostConstruct y @PreDestroy de Spring
- Anotación @Resource de Spring
- Anotación @Required de Spring
- Anotación @Value de Spring
- Herencia de la definición de Bean de Spring
- Spring Tipos de Contenedores IoC – ApplicationContext y BeanFactory
- Ejemplo OneToMany de Spring + JPA (Hibernate)
- Spring Boot y la Inyección de Dependencias
- Piscina de cadenas constantes en Java
- Cómo crear una clase de excepción personalizada en Java
- Cómo ordenar ArrayList de objetos en Java
- Tutorial de Ejecutores en Java – Executor, ExecutorService, ScheduledExecutorService
- Tipo primitivo Streams en Java
- Cómo comprimir la salida de la fase de mapa en Hadoop MapReduce
Eso es todo para el tema Anotación @Scope de Spring. Si falta algo o tienes algo que compartir sobre el tema por favor escribe un comentario.
También te puede gustar
.