首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 2.0 新增 Web Scope(request/session/globalSession)實現原理剖析

     編輯:Java 相關知識

Spring 2.0 在 singleton、prototype 之外新增 request、session、globalSession 三種 Web Scope。本文從源碼角度解析 Scope 介面、ConfigurableBeanFactory 註冊機制、WebApplicationContext 初始化流程,揭示為何僅 Web 容器可用。

核心介面:Scope

public interface Scope {
    Object get(String name, ObjectFactory objectFactory);  // 取得或建立 Bean
    Object remove(String name);                             // 移除 Bean
}

BeanFactory 註冊擴展點

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory {
    void registerScope(String scopeName, Scope scope);      // 註冊新 Scope
    void destroyScopedBean(String beanName);                // 銷毀 Scope Bean
}

AbstractBeanFactory.getBean() 關鍵邏輯

String scopeName = mergedBeanDefinition.getScope();        // 讀取 bean 定義中的 scope
Scope scope = (Scope) this.scopes.get(scopeName);          // 從工廠取得 Scope 實現
if (scope == null) throw new IllegalStateException(...);

Object scopedInstance = scope.get(beanName, new ObjectFactory() {
    public Object getObject() {
        beforePrototypeCreation(beanName);
        try { return createBean(beanName, mergedBeanDefinition, args); }
        finally { afterPrototypeCreation(beanName); }
    }
});

WebApplicationContext 自動註冊

public interface WebApplicationContext extends ApplicationContext {
    String SCOPE_REQUEST = "request";
    String SCOPE_SESSION = "session";
    String SCOPE_GLOBAL_SESSION = "globalSession";
}

// 所有 WebApplicationContext 實現類在 postProcessBeanFactory 中註冊
protected void postProcessBeanFactory(ConfigurableListableBeanFactory bf) {
    bf.registerScope(SCOPE_REQUEST, new RequestScope());
    bf.registerScope(SCOPE_SESSION, new SessionScope(false));
    bf.registerScope(SCOPE_GLOBAL_SESSION, new SessionScope(true));
}

關鍵結論

  • 普通 BeanFactory 僅內建 singleton/prototype,**不含 Web Scope 實現**。
  • 只有 WebApplicationContext(及其子類)在啟動時自動註冊三個 Web Scope。
  • 非 Web 環境若強制使用 scope="request" 會拋出 No Scope registered 異常。
  • 開發者可自行實作 Scope 介面並註冊,打造自定義生命週期(如 Thread Scope、Tenant Scope)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved