Al definir un <bean> tienes la opción de declarar un ámbito para ese bean. Por ejemplo, para forzar a Spring a producir una nueva instancia de bean cada vez que se necesite una, debes declarar que el atributo scope del bean sea prototype. Del mismo modo, si quiere que Spring devuelva la misma instancia de bean cada vez que se necesite uno, debe declarar el atributo scope del bean como singleton.
El Spring Framework admite los siguientes cinco scopes, tres de los cuales sólo están disponibles si se utiliza un ApplicationContext compatible con la web.
Alcance & Descripción | |
---|---|
1 |
Singleton Este alcance la definición del bean a una sola instancia por contenedor Spring IoC (por defecto). |
prototype
Esto hace que la definición de un bean tenga cualquier número de instancias de objetos. |
|
3
Esto hace que la definición de un bean tenga una solicitud HTTP. Sólo es válido en el contexto de un Spring ApplicationContext con conciencia web. |
4 | session
Este alcance de una definición de bean a una sesión HTTP. Sólo es válido en el contexto de un Spring ApplicationContext con conciencia web. |
5 |
global-session Esta definición de bean tiene como ámbito una sesión HTTP global. Sólo es válido en el contexto de un Spring ApplicationContext con conciencia web. |
En este capítulo, hablaremos de los dos primeros scopes y los tres restantes los veremos cuando hablemos del Spring ApplicationContext con conciencia web.
El ámbito singleton
Si un ámbito se establece como singleton, el contenedor IoC de Spring crea exactamente una instancia del objeto definido por esa definición de bean. Esta única instancia se almacena en una caché de dichos beans singleton, y todas las solicitudes y referencias posteriores para ese bean con nombre devuelven el objeto almacenado en caché.
El ámbito por defecto es siempre singleton. Sin embargo, cuando se necesita una y sólo una instancia de un bean, se puede establecer la propiedad scope a singleton en el archivo de configuración del bean, como se muestra en el siguiente fragmento de código –
<!-- A bean definition with singleton scope --><bean id = "..." class = "..." scope = "singleton"> <!-- collaborators and configuration for this bean go here --></bean>
Ejemplo
Tengamos un IDE Eclipse funcionando y sigamos los siguientes pasos para crear una aplicación Spring –
Pasos | Descripción | ||
---|---|---|---|
1 | Crear un proyecto con nombre SpringExample y crear un paquete com.tutorialspoint bajo la carpeta src en el proyecto creado. | ||
2 | Agrega las librerías de Spring necesarias utilizando la opción Add External JARs como se explica en el capítulo Spring Hello World Example. | ||
3 | Crear las clases Java HelloWorld y MainApp bajo el paquete com.tutorialspoint. | 4 | Crear el fichero de configuración Beans.xml bajo la carpeta src. | 5 | El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Beans y ejecutar la aplicación como se explica a continuación. |
Aquí está el contenido del archivo HelloWorld.java –
package com.tutorialspoint;public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); }}
A continuación está el contenido del archivo MainApp.java –
package com.tutorialspoint;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { public static void main(String args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld objA = (HelloWorld) context.getBean("helloWorld"); objA.setMessage("I'm object A"); objA.getMessage(); HelloWorld objB = (HelloWorld) context.getBean("helloWorld"); objB.getMessage(); }}
A continuación se muestra el archivo de configuración Beans.xml necesario para el ámbito singleton –
<?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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "singleton"> </bean></beans>
Una vez que hayas terminado de crear los archivos de configuración de fuentes y beans, vamos a ejecutar la aplicación. Si todo está bien con tu aplicación, imprimirá el siguiente mensaje –
Your Message : I'm object AYour Message : I'm object A
El ámbito del prototipo
Si el ámbito se establece como prototipo, el contenedor de Spring IoC crea una nueva instancia del objeto bean cada vez que se realiza una solicitud para ese bean específico. Como norma, utilice el ámbito prototipo para todos los beans con estado y el ámbito singleton para los beans sin estado.
Para definir un ámbito prototipo, se puede establecer la propiedad scope a prototype en el fichero de configuración del bean, como se muestra en el siguiente fragmento de código –
<!-- A bean definition with prototype scope --><bean id = "..." class = "..." scope = "prototype"> <!-- collaborators and configuration for this bean go here --></bean>
Ejemplo
Tengamos el IDE Eclipse funcionando y sigamos los siguientes pasos para crear una aplicación Spring –
Pasos | Descripción | ||
---|---|---|---|
1 | Crear un proyecto con nombre SpringExample y crear un paquete com.tutorialspoint bajo la carpeta src en el proyecto creado. | ||
2 | Agrega las librerías de Spring necesarias utilizando la opción Add External JARs como se explica en el capítulo Spring Hello World Example. | ||
3 | Crear las clases Java HelloWorld y MainApp bajo el paquete com.tutorialspoint. | 4 | Crear el fichero de configuración Beans.xml bajo la carpeta src. | 5 | El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Beans y ejecutar la aplicación como se explica a continuación. |
Aquí está el contenido del archivo HelloWorld.java
package com.tutorialspoint;public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); }}
A continuación se muestra el contenido del archivo MainApp.java –
package com.tutorialspoint;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp { public static void main(String args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld objA = (HelloWorld) context.getBean("helloWorld"); objA.setMessage("I'm object A"); objA.getMessage(); HelloWorld objB = (HelloWorld) context.getBean("helloWorld"); objB.getMessage(); }}
A continuación se muestra el archivo de configuración Beans.xml necesario para el ámbito del prototipo –
<?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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" scope = "prototype"> </bean></beans>