// 1. Classpath 下載配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2. 文件系統路徑
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:/config/app.xml");
// 3. 多配置文件
new ClassPathXmlApplicationContext(new String[]{"dao.xml", "service.xml"});
// 4. 獲取 Bean
UserService service = ctx.getBean("userService", UserService.class);
<bean id="userService" class="com.example.UserServiceImpl"></bean>
<alias name="userService" alias="svc"/> <!-- 別名:ctx.getBean("svc") 同樣可獲取 -->
| 方式 | 配置範例 | 適用場景 |
|---|---|---|
| 構造器(無參) | <bean id="a" class="A"/> | 90% 場景,標準 JavaBean |
| 靜態工廠方法 | <bean id="b" class="Factory" factory-method="getInstance"/> | 單例、連接池、不可變對象 |
| 實例工廠方法 | <bean id="factory" class="FactoryImpl"/><bean id="c" factory-bean="factory" factory-method="create"/> | 複雜構建邏輯、第三方庫集成 |
| Scope | 生命周期 | 線程安全 | 典型用途 |
|---|---|---|---|
singleton(默認) | 容器啟動~關閉,單實例共享 | 需自行保證 | Service、DAO、工具類 |
prototype | 每次 getBean 新建,容器不管銷毀 | 天然隔離 | 有狀態對象、請求級對象 |
request | 單次 HTTP 請求 | 請求隔離 | Web 控制器 |
session | 用戶會話 | 會話隔離 | 購物車、用戶偏好 |
<bean id="demo" class="Demo" init-method="init" destroy-method="close"
lazy-init="true" scope="singleton"></bean>
class Demo {
Demo() { println("1. 構造器") }
void init() { println("2. 初始化回調") }
void doWork() { println("3. 業務使用") }
void close() { println("4. 銷毀回調") } // 僅 singleton 生效
}
執行順序:構造器 → 初始化 → 業務使用 → 銷毀(容器關閉)
lazy-init="true":延遲到首次 getBean 才實例化(原型無效)。
<bean id="service" class="UserServiceImpl">
<!-- 1. 構造器注入 -->
<constructor-arg ref="userDao"/>
<constructor-arg value="default"/>
<!-- 2. Setter 注入 -->
<property name="userDao" ref="userDao"/>
<property name="prefix" value="pre_"/>
<!-- 3. P 命名空間簡寫 -->
<!-- xmlns:p="https://www.springframework.org/schema/p" -->
<!-- p:userDao-ref="userDao" p:prefix="pre_" -->
</bean>
<bean id="service" class="UserServiceImpl" autowire="byType"/>
@ComponentScan("com.example")
@Configuration
public class AppConfig {}
@Service public class UserServiceImpl {
@Autowired private UserDao userDao; // 構造器/Setter/字段均可
}
| 術語 | 說明 |
|---|---|
| Joinpoint | 連接點:方法調用、異常拋出等 |
| Pointcut | 切點:定義攔截哪些連接點(表達式) |
| Advice | 通知:Before/After/AfterReturning/AfterThrowing/Around |
| Aspect | 切面:Pointcut + Advice |
| Weaving | 織入:編譯期/類加載期/運行期 |
Spring 核心在於「IOC 管理對象生命周期,DI 解耦依賴,AOP 分離橫切邏輯」。掌握 Bean 定義、作用域、生命周期、注入方式、自動裝配、Annotation 配置、AOP 基礎,即可上手企業級開發。現代項目推薦:全 Annotation + Java Config + Spring Boot 自動裝配,XML 僅用於整合第三方非 Spring 組件。