27/11/2008

[TutorialSpring] Bean scopes

Hoy inicio una nueva serie en mi blog TutorialSpring en donde iré publicando pequeños tutoriales sobre temas específicos de Spring Framework.

Voy a comenzar con los Bean scopes de Spring, si bien casi siempre utilizamos el Singleton Scope, es importante conocer los demás scopes para aplicarlos cuando sea requerido.

Singleton Scope

Implementa el patrón singleton, existe una sola instancia del objeto en el contenedor IoC. El patrón singleton en Spring es distinto al de Gang of Four en donde se asegura una sola instancia del objeto por Classloader, en el caso de Spring es una sola instancia en el ApplicationContext. Este es el scope por defecto en Spring.

<bean id="accountService" class="com.foo.DefaultAccountService"/>

Prototype Scope

Se crea una nueva instancia cada vez que se realiza un request al bean.

<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>

Como regla, se debe utilizar el scope prototype para los beans que conservan su estado (stateful) y como singleton los que no conservan su estado (stateless). Para la mayoría de los casos se utiliza el scope singleton, nunca he tenido la necesidad de definir un bean como prototype. Las clases Controller, Service y Dao se definen como singleton y deben ser diseñados como thread safe.

Los siguientes scopes son solo válidos en el contexto web del Spring ApplicationContext, si estas usando Spring MVC o Spring Portlet MVC no se requiere de configuración adicional ya que el DispatcherServlet se encarga de asociar el scope de los beans a los requests. Si estás usando otro framework debes agregar un listener para que haga este trabajo.

<web-app>
...
<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>

Request Scope

La instancia del bean se asocia al ciclo del HttpServletRequest.

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>

Session Scope

La instancia del bean se asocia al ciclo de HttpSession.

<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>

Global Session Scope

Similar al Session Scope, solo es válido para un contexto de portlets. La instancia del bean se asocia al HttpSession global de la aplicación portlet.

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/>

Fuente: Spring Reference Documentation

1 comentarios:

Oscar Manuel dijo...

Has logrado que un Action se cargue con scope de request? Yo no he podido y todos los actions se me instancian como singleton al cargar el contexto de la aplicación