Spring 作為 Java 企業級開發的事實標準,其核心價值在於 IoC (控制反轉) 容器對對象生命週期與依賴關係的統一管理。本文將從核心概念、快速入門、容器體系、Bean 生命週期三個維度,系統梳理 Spring 核心機制。
| 概念 | 全稱 | 核心含義 |
|---|---|---|
| Bean | — | Spring 容器管理的任意 Java 對象 (Service、DAO、DataSource、Controller 等) |
| IoC | Inversion of Control | 將對象創建、依賴維護權從應用代碼轉移到 Spring 容器 |
| DI | Dependency Injection | IoC 的具體實現方式:容器自動注入依賴對象,而非對象主動查找 |

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.x</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
applicationContext.xml<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Bean 定義:id 唯一標識,class 全限定類名 -->
<bean id="userService" class="com.service.UserService">
<!-- setter 注入:name 對應屬性名,value 基本類型/字符串 -->
<property name="name"><value>韓順平</value></property>
<!-- ref 注入:引用另一個 Bean -->
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.dao.UserDaoImpl"/>
</beans>
public class Client {
public static void main(String[] args) {
// 1. 啟動容器,加載配置文件
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2. 從容器獲取 Bean
UserService us = (UserService) ac.getBean("userService");
// 3. 使用 Bean
us.sayHello();
}
}

new UserService()、new UserDaoImpl()、手動 setUserDao(),強耦合、難測試、難擴展| 特性 | BeanFactory | ApplicationContext |
|---|---|---|
| 繼承關係 | 頂層接口 | 繼承 BeanFactory,擴展企業級功能 |
| Bean 實例化策略 | 延遲加載:getBean() 時才創建 | 預實例化:啟動時創建所有 singleton Bean |
| 國際化 (i18n) | 不支援 | 支援 MessageSource |
| 事件發布 | 不支援 | 支援 ApplicationEvent 機制 |
| 資源加載 | 僅 ResourceLoader | 支援 classpath:/file:/http: 等前綴 |
| 典型實現 | XmlBeanFactory | ClassPathXmlApplicationContext、AnnotationConfigApplicationContext、XmlWebApplicationContext |
// 1. 類路徑 (最常用)
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2. 文件系統絕對路徑
ApplicationContext ac = new FileSystemXmlApplicationContext("D:/project/src/applicationContext.xml");
// 3. Web 環境 (Tomcat 啟動自動加載,配置 web.xml ContextLoaderListener)
XmlWebApplicationContext ac = (XmlWebApplicationContext) WebApplicationContextUtils
.getWebApplicationContext(servletContext);
ContextLoaderListener 托管,非 Web 環境用靜態持有或單例模式
scope=singleton Bean 實例化 (構造器/工廠方法)setBeanName(String name) 注入 Bean IDsetBeanFactory(BeanFactory bf) 注入工廠引用setApplicationContext(ApplicationContext ac)postProcessBeforeInitialization(bean, beanName) — AOP 代理創建關鍵點afterPropertiesSet()<bean init-method="init"> 指定初始化方法postProcessAfterInitialization(bean, beanName) — 代理封裝完成ConfigurableApplicationContext.close() 或 Web 容器關閉觸發destroy()<bean destroy-method="cleanup"> 指定銷毀方法實例化 → 屬性賦值 → 前置處理 → 初始化 → 後置處理 → 使用 → 銷毀


// 接口
public interface CaseConverter { String convert(String input); }
// 實現 A
public class UpperCaseConverter implements CaseConverter {
public String convert(String input) { return input.toUpperCase(); }
}
// 實現 B
public class LowerCaseConverter implements CaseConverter {
public String convert(String input) { return input.toLowerCase(); }
}
// 業務層依賴接口
@Service
public class TextProcessor {
private CaseConverter converter;
public void setConverter(CaseConverter converter) { this.converter = converter; }
public String process(String text) { return converter.convert(text); }
}
// 配置切換實現,業務代碼零修改
<bean id="converter" class="com.demo.UpperCaseConverter"/>
<bean id="textProcessor" class="com.demo.TextProcessor">
<property name="converter" ref="converter"/>
</bean>