1. 程式人生 > >Spring Bean的域scope

Spring Bean的域scope

1. Spring Bean內建的域scope:

  • singleton
             預設,一個Spring IoC容器中只能有一個bean例項,容器啟動時初始化
  • prototype
             在一個Spring IoC容器中可以有多個bean例項,每次被呼叫gettor時初始化

  • request
             bean例項的生命週期只在一次HTTP請求中,即每次HTTP請求都建立一個新的bean例項
            只能在WebApplicationContext上下文中配置,如XmlWebApplicationContext
  • session
             bean例項的生命週期在HTTP session中
            只能在WebApplicationContext上下文中配置,如XmlWebApplicationContext
  • global session
             bean例項的生命週期在全域性的HTTP session中(典型地,跨portlet)
             只能在WebApplicationContext上下文中配置,如XmlWebApplicationContext
  • application
             bean例項的生命週期在ServletContext中
             只能在WebApplicationContext上下文中配置,如XmlWebApplicationContext

2. 為支援Spring Bean的request/session/global session/application域,需要對Web應用的上下文中(在web.xml檔案中)進行如下配置:

  • 如果已經配置了Spring Web MVC的DispatcherServlet或DispatcherPortlet,則無需再做其他配置
  • 如果沒有使用Spring Web MVC,需要在web.xml中配置如下:
    <listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

  • 如果沒有使用Spring Web MVC,對於Servlet 3.0以上容器,還可以程式設計實現org.springframework.web.WebApplicationInitializer介面如下:
 public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
      XmlWebApplicationContext appContext = new XmlWebApplicationContext();
      appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");


      ServletRegistration.Dynamic dispatcher =
        container.addServlet("dispatcher", new DispatcherServlet(appContext));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/");
    }

 }