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

Spring 核心原理入門:IoC 容器、Bean 生命週期與依賴注入全解析

     編輯:Java 綜合教學

Spring 核心原理入門:IoC 容器與 Bean 管理全解析

Spring 作為 Java 企業級開發的事實標準,其核心價值在於 IoC (控制反轉) 容器對對象生命週期與依賴關係的統一管理。本文將從核心概念、快速入門、容器體系、Bean 生命週期三個維度,系統梳理 Spring 核心機制。

核心概念三板斧

概念全稱核心含義
Bean—Spring 容器管理的任意 Java 對象 (Service、DAO、DataSource、Controller 等)
IoCInversion of Control將對象創建、依賴維護權從應用代碼轉移到 Spring 容器
DIDependency InjectionIoC 的具體實現方式:容器自動注入依賴對象,而非對象主動查找

Spring 核心概念圖

五分鐘快速入門

1. 依賴引入 (最小集)

<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>

2. 容器配置文件 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>

3. 客戶端代碼

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 vs Spring 容器管理對比

Spring 運行原理圖

  • 傳統:代碼中显式 new UserService()、new UserDaoImpl()、手動 setUserDao(),強耦合、難測試、難擴展
  • Spring:配置元數據聲明依賴,容器負責實例化、注入、生命週期管理,實現接口編程 + 依賴倒置,層級解耦

Spring 容器體系:BeanFactory vs ApplicationContext

核心區別

特性BeanFactoryApplicationContext
繼承關係頂層接口繼承 BeanFactory,擴展企業級功能
Bean 實例化策略延遲加載:getBean() 時才創建預實例化:啟動時創建所有 singleton Bean
國際化 (i18n)不支援支援 MessageSource
事件發布不支援支援 ApplicationEvent 機制
資源加載僅 ResourceLoader支援 classpath:/file:/http: 等前綴
典型實現XmlBeanFactoryClassPathXmlApplicationContext、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);

最佳實踐

  • 生產環境強制使用 ApplicationContext:預加載發現配置錯誤、啟動階段完成資源初始化、運行期零延遲
  • ApplicationContext 是重量級對象:務必設計為單例,Web 環境由 ContextLoaderListener 托管,非 Web 環境用靜態持有或單例模式
  • BeanFactory 僅用於記憶體極度受限、啟動速度極其敏感的特殊場景 (如嵌入式設備、單元測試 Mock)

Bean 生命週期完整流程 (13 步)

Bean 生命週期流程圖

  1. 實例化:容器啟動掃描配置,對 scope=singleton Bean 實例化 (構造器/工廠方法)
  2. 屬性賦值:調用 Setter 方法注入依賴與配置值
  3. BeanNameAware:實現則回調 setBeanName(String name) 注入 Bean ID
  4. BeanFactoryAware:實現則回調 setBeanFactory(BeanFactory bf) 注入工廠引用
  5. ApplicationContextAware:實現則回調 setApplicationContext(ApplicationContext ac)
  6. BeanPostProcessor 前置:postProcessBeforeInitialization(bean, beanName) — AOP 代理創建關鍵點
  7. InitializingBean:實現則回調 afterPropertiesSet()
  8. 自定義 init-method:<bean init-method="init"> 指定初始化方法
  9. BeanPostProcessor 後置:postProcessAfterInitialization(bean, beanName) — 代理封裝完成
  10. 就緒使用:Bean 可正常服務業務調用
  11. 容器關閉:ConfigurableApplicationContext.close() 或 Web 容器關閉觸發
  12. DisposableBean:實現則回調 destroy()
  13. 自定義 destroy-method:<bean destroy-method="cleanup"> 指定銷毀方法

實戰精簡流程 (常用 6 步)

實例化 → 屬性賦值 → 前置處理 → 初始化 → 後置處理 → 使用 → 銷毀

Bean 生命週期簡化圖

BeanFactory vs ApplicationContext 生命週期差異

BeanFactory 生命週期

  • BeanFactory:無預實例化、無 BeanPostProcessor 自動註冊、無國際化/事件/資源加載增強,生命週期極簡
  • ApplicationContext:完整企業級生命週期,支援所有擴展點

Spring 與接口編程:DI 實現層級解耦

// 接口
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>

總結

  • Spring 本質是高級對象工廠 + 依賴注入容器,通過配置元數據 (XML/Annotation/JavaConfig) 驅動對象圖構建
  • IoC/DI 將控制權反轉給容器,應用代碼專注業務邏輯,實現高內聚、低耦合、易測試、易擴展
  • 掌握 Bean 生命週期 13 步 是理解 AOP、事務、事務同步、緩存等高級特性實現原理的前提
  • ApplicationContext 單例模式啟動 是生產環境鐵律
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved