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

Spring 入門(三):Web 環境下的配置加載與容器初始化

     編輯:Java 相關知識

Spring 容器初始化的三種常見方式

Spring 容器的啟動核心在於配置文件的加載。根據運行環境不同,主要有三種實現類:

  • ClassPathXmlApplicationContext:從類路徑(classpath)加載配置文件,適合獨立應用與測試環境。
  • FileSystemXmlApplicationContext:從文件系統絕對路徑加載,適用於配置文件固定在磁盤特定位置的場景。
  • XmlWebApplicationContext:專為 Web 環境設計,從 Web 應用上下文中加載,是 Web 專案的標準選擇。

BeanFactory 與 ApplicationContext 的區別

1. BeanFactory:基礎的 IoC 容器

BeanFactory 是 Spring 最底層的容器接口,提供基本的依賴注入(DI)支持。雖然功能輕量,但在現代開發中較少直接使用,主要場景為資源受限的移動設備或特殊嵌入式環境。

// 從類路徑加載
Resource resource = new ClassPathResource("spring.xml");
BeanFactory factory = new XmlBeanFactory(resource);

// 從文件系統加載
Resource fsResource = new FileSystemResource("D:/project/src/spring.xml");
BeanFactory factory = new XmlBeanFactory(fsResource);

// 獲取 Bean
HelloService service = factory.getBean("helloServiceImpl", HelloServiceImpl.class);
service.sayHello();

注意:XmlBeanFactory 不支持 InputStreamResource,因其 isOpen() 方法會返回 true,導致流無法重複讀取。

2. ApplicationContext:企業級開發的首選

ApplicationContext 繼承自 BeanFactory,並在其基礎上擴展了企業級功能:

  • 國際化(i18n)訊息解析
  • 統一的資源加載策略(圖片、屬性文件等)
  • 事件發布/訂閱機制(ApplicationEvent)
  • 對 Web 應用的原生支持

實際開發中幾乎總是使用 ApplicationContext 及其子類:

// 推薦寫法:使用前綴明確指定資源類型
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("file:D:/project/src/spring.xml");

HelloService service = ctx.getBean("helloServiceImpl", HelloServiceImpl.class);
service.sayHello();

Web 環境下的容器初始化

方式一:手動創建 XmlWebApplicationContext

在 Servlet 或 Filter 中手動啟動容器:

XmlWebApplicationContext context = new XmlWebApplicationContext();
// 默認加載 /WEB-INF/applicationContext.xml
// 可自定義路徑:
// context.setConfigLocations(new String[]{"/WEB-INF/classes/applicationContext.xml"});

// 必須設置 ServletContext,否則無法解析 Web 相對路徑
context.setServletContext(getServletContext());
// 觸發容器刷新,完成 Bean 定義讀取與實例化
context.refresh();

HelloDao dao = context.getBean("helloDaoImpl", HelloDaoImpl.class);
dao.sayHello();

若未在 web.xml 配置 ContextLoaderListener,默認配置文件路徑為 /WEB-INF/applicationContext.xml,需確保文件存在。

方式二:使用 WebApplicationContextUtils 工具類(推薦)

在已由 ContextLoaderListener 初始化的 Web 應用中,直接從 ServletContext 獲取現有上下文:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
// 或強制獲取,若不存在則拋出異常
// WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());

HelloDao dao = ctx.getBean("helloDaoImpl", HelloDaoImpl.class);
dao.sayHello();

常見錯誤與解決方案

現象原因解決方法
getWebApplicationContext 返回 null未配置 ContextLoaderListener在 web.xml 添加監聽器配置
getRequiredWebApplicationContext 拋出 IllegalStateException同上同上

web.xml 必備配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

配置後,Spring 容器會在 Web 應用啟動時自動初始化,後續可通過工具類隨處獲取。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved