Spring 容器的啟動核心在於配置文件的加載。根據運行環境不同,主要有三種實現類:
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,導致流無法重複讀取。
ApplicationContext 繼承自 BeanFactory,並在其基礎上擴展了企業級功能:
實際開發中幾乎總是使用 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();
在 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,需確保文件存在。
在已由 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 | 同上 | 同上 |
<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 應用啟動時自動初始化,後續可通過工具類隨處獲取。