java - initializr - spring mvc vs spring boot
Alcance de Spring Bean (6)
¿Alguien puede explicar qué son los ámbitos en Spring beans? Siempre he usado el "prototipo", pero ¿hay otros parámetros que pueda poner en lugar de eso?
Ejemplo de lo que estoy hablando
<bean id="customerInfoController" class="com.action.customer.Controller" scope="prototype">
<property name="accountDao" ref="accountDao"/>
<property name="utilityDao" ref="utilityDao"/>
<property name="account_usageDao" ref="account_usageDao"/>
</bean>
A partir de las especificaciones de primavera , hay cinco tipos de ámbitos de frijol compatibles:
1. singleton (predeterminado *)
Busca una definición de bean único en una sola instancia de objeto por contenedor Spring IoC.
2. prototipo
Busca una definición de bean simple para cualquier cantidad de instancias de objetos.
3. solicitud
Busca una definición de bean único para el ciclo de vida de una sola solicitud HTTP; es decir, cada solicitud HTTP tendrá su propia instancia de un bean creado en la parte posterior de una única definición de bean. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
4. sesión
Busca una definición de bean simple para el ciclo de vida de una sesión HTTP. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
5. sesión global
Busca una definición de bean único para el ciclo de vida de una sesión HTTP global. Normalmente solo es válido cuando se usa en un contexto de portlet. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
* por defecto significa que no se proporciona explícitamente ningún ámbito en la etiqueta <bean />
. Lea más sobre ellos aquí: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html
Acerca de los prototipos de frijol (es):
El código del cliente debe limpiar los objetos del alcance del prototipo y liberar los recursos costosos que el bean (s) prototipo está reteniendo. Para que el contenedor Spring libere los recursos almacenados en los beans de ámbito prototipo, intente utilizar un postprocesador de bean personalizado, que contiene una referencia a los beans que deben limpiarse.
En Spring, bean scope se usa para decidir qué tipo de instancia de beans debe devolverse desde el contenedor de Spring al llamador.
5 tipos de ámbitos de frijol son compatibles:
Singleton: Devuelve una única instancia de bean por contenedor Spring IoC . Esta única instancia se almacena en un caché de dichos beans singleton, y todas las solicitudes y referencias posteriores para ese bean llamado devuelven el objeto almacenado en caché. Si no se especifica bean scope en la configuración de beans archivo, predeterminado a singleton.
Prototipo : devuelve una nueva instancia de bean cada vez que se solicita. No almacena ninguna versión de caché como singleton.
Solicitud : devuelve una única instancia de bean por solicitud HTTP.
Sesión : Devuelve una única instancia de bean por sesión HTTP (sesión de nivel de usuario).
GlobalSession : Devuelve una sola instancia de bean por sesión HTTP global. Solo es válido en el contexto de Spring ApplicationContext (sesión de nivel de aplicación) con reconocimiento web.
En la mayoría de los casos, solo puede tratar con el alcance principal de Spring: singleton y prototipo , y el alcance predeterminado es singleton .
La documentación de Spring describe los siguientes ámbitos estándar :
singleton : (Predeterminado) Busca una sola definición de bean en una única instancia de objeto por contenedor Spring IoC.
prototipo : alcanza una sola definición de bean a cualquier cantidad de instancias de objeto.
solicitud : aplica una sola definición de bean al ciclo de vida de una sola solicitud HTTP; es decir, cada solicitud HTTP tiene su propia instancia de un bean creado en la parte posterior de una única definición de bean. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
sesión : alcanza una sola definición de bean al ciclo de vida de una sesión HTTP. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
sesión global : alcanza una sola definición de bean al ciclo de vida de una sesión HTTP global. Normalmente solo es válido cuando se usa en un contexto de portlet. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
Los ámbitos personalizados adicionales también se pueden crear y configurar con un CustomScopeConfigurer
. Un ejemplo sería el alcance de flow
agregado por Spring Webflow.
Por cierto, usted argumenta que siempre usó el prototype
lo que encuentro extraño. El alcance estándar es singleton
y en la aplicación que desarrollo, rara vez necesito el alcance del prototipo. Deberías tal vez echarle un vistazo a esto.
La explicación detallada de cada alcance se puede encontrar aquí en los alcances de Spring Bean . A continuación está el resumen
Singleton - (Predeterminado) Busca una sola definición de bean en una sola instancia de objeto por contenedor Spring IoC.
prototipo : alcanza una sola definición de bean para cualquier cantidad de instancias de objeto.
solicitud : alcanza una sola definición de bean al ciclo de vida de una sola solicitud HTTP; es decir, cada solicitud HTTP tiene su propia instancia de un bean creado en la parte posterior de una única definición de bean. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
sesión : alcanza una sola definición de bean al ciclo de vida de una sesión HTTP. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
sesión global : alcanza una única definición de bean para el ciclo de vida de una sesión HTTP global. Normalmente solo es válido cuando se usa en un contexto de portlet. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
Solo quiero actualizar, que en Spring 5, como se menciona en Spring docs , Spring admite 6 ámbitos, cinco de los cuales solo están disponibles si usa ApplicationContext compatible con web.
singleton (Predeterminado) Busca una sola definición de bean en una única instancia de objeto por contenedor Spring IoC.
prototype: aplica una definición de bean única a cualquier cantidad de instancias de objeto.
request Scopes una sola definición de bean al ciclo de vida de una única solicitud HTTP; es decir, cada solicitud HTTP tiene su propia instancia de un bean creado en la parte posterior de una única definición de bean. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
sesión Accede a una única definición de bean para el ciclo de vida de una sesión HTTP. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
aplicación Busca una definición de bean único en el ciclo de vida de un ServletContext. Solo válido en el contexto de Spring ApplicationContext compatible con la web.
websocket Busca una sola definición de bean en el ciclo de vida de un WebSocket. Solo válido en el contexto de Spring ApplicationContext compatible con la web.