Primavera - Bean Scopes
Al definir un <bean>, tiene la opción de declarar un alcance para ese bean. Por ejemplo, para obligar a Spring a producir una nueva instancia de bean cada vez que se necesita una, debe declarar que el atributo de alcance del bean esprototype. De manera similar, si desea que Spring devuelva la misma instancia de bean cada vez que se necesita una, debe declarar que el atributo de alcance del bean essingleton.
Spring Framework admite los siguientes cinco ámbitos, tres de los cuales están disponibles solo si usa un ApplicationContext compatible con la web.
No Señor. | Alcance y descripción |
---|---|
1 | singleton Esto aplica el alcance de la definición de bean a una sola instancia por contenedor Spring IoC (predeterminado). |
2 | prototype Esto permite que una única definición de bean tenga cualquier número de instancias de objeto. |
3 | request Esto aplica una definición de bean a una solicitud HTTP. Solo válido en el contexto de un Spring ApplicationContext compatible con web. |
4 | session Esto aplica el alcance de una definición de bean a una sesión HTTP. Solo válido en el contexto de un Spring ApplicationContext compatible con web. |
5 | global-session Esto aplica el alcance de una definición de bean a una sesión HTTP global. Solo válido en el contexto de un Spring ApplicationContext compatible con web. |
En este capítulo, discutiremos sobre los dos primeros ámbitos y los tres restantes se discutirán cuando hablemos sobre Spring ApplicationContext compatible con web.
El alcance singleton
Si un alcance se establece en singleton, el contenedor Spring IoC 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 en caché.
El alcance predeterminado es siempre singleton. Sin embargo, cuando necesita una y solo una instancia de un bean, puede configurar elscope propiedad 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 de Eclipse en funcionamiento y sigamos los siguientes pasos para crear una aplicación Spring:
Pasos | Descripción |
---|---|
1 | Cree un proyecto con un nombre SpringExample y cree un paquete com.tutorialspoint bajo elsrc carpeta en el proyecto creado. |
2 | Agregue las bibliotecas Spring requeridas usando la opción Agregar JAR externos como se explica en el capítulo Ejemplo de Spring Hello World . |
3 | Cree clases Java HelloWorld y MainApp en el paquete com.tutorialspoint . |
4 | Cree el archivo de configuración de Beans Beans.xml bajo elsrc carpeta. |
5 | El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Bean y ejecutar la aplicación como se explica a continuación. |
Aquí está el contenido de HelloWorld.java archivo -
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 de la MainApp.java archivo -
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 requerido para alcance 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 haya terminado de crear los archivos de configuración de fuente y bean, ejecutemos la aplicación. Si todo está bien con su aplicación, imprimirá el siguiente mensaje:
Your Message : I'm object A
Your Message : I'm object A
El alcance del prototipo
Si el alcance se establece en prototipo, el contenedor Spring IoC crea una nueva instancia de bean del objeto cada vez que se realiza una solicitud para ese bean específico. Como regla, utilice el alcance del prototipo para todos los beans con estado completo y el alcance singleton para los beans sin estado.
Para definir un alcance de prototipo, puede establecer el scope propiedad a prototype en el archivo 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 de Eclipse en funcionamiento y sigamos los siguientes pasos para crear una aplicación Spring:
Pasos | Descripción |
---|---|
1 | Cree un proyecto con un nombre SpringExample y cree un paquete com.tutorialspoint bajo elsrc carpeta en el proyecto creado. |
2 | Agregue las bibliotecas Spring requeridas usando la opción Agregar JAR externos como se explica en el capítulo Ejemplo de Spring Hello World . |
3 | Cree clases Java HelloWorld y MainApp en el paquete com.tutorialspoint . |
4 | Cree el archivo de configuración de Beans Beans.xml bajo elsrc carpeta. |
5 | El paso final es crear el contenido de todos los archivos Java y el archivo de configuración de Bean y ejecutar la aplicación como se explica a continuación. |
Aquí está el contenido de HelloWorld.java archivo
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 de la MainApp.java archivo -
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 requerido para el alcance 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>
Una vez que haya terminado de crear los archivos de configuración de fuente y bean, ejecutemos la aplicación. Si todo está bien con su aplicación, imprimirá el siguiente mensaje:
Your Message : I'm object A
Your Message : null