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

Spring IoC 核心總結:從容器啟動到 Bean 生命週期的完整知識圖譜

     編輯:Java 綜合教學

Spring IoC 核心總結:從容器啟動到 Bean 生命週期的完整知識圖譜

IoC (Inversion of Control) 與 DI (Dependency Injection) 是 Spring 框架的基石。本文系統梳理 Spring IoC 容器體系、Bean 配置方式、依賴注入模式、高級特性 (自動裝配、繼承、作用域、SpEL、生命週期、FactoryBean)、注解驅動開發等核心知識點,構建完整知識圖譜。

一、IoC 容器體系與啟動

容器類型核心實現類特點
BeanFactoryDefaultListableBeanFactoryIOC 基礎實現,延遲加載,Spring 內部使用
ApplicationContextClassPathXmlApplicationContext
FileSystemXmlApplicationContext
AnnotationConfigApplicationContext
高級功能:國際化、事件發布、資源加載、啟動時實例化所有單例 Bean
WebApplicationContextXmlWebApplicationContextWeb 專用,從 WEB-INF 相對路徑加載,綁定 ServletContext

啟動流程:實例化容器 → 加載配置元數據 (XML/注解/JavaConfig) → 解析 BeanDefinition → 實例化 Bean → 填充屬性 → 初始化 (回調) → 註冊銷毀回調 → 可用。

二、Bean 配置三大核心要素

<bean id="msg" class="java.lang.String">
    <constructor-arg value="hello"/> 
</bean>

<bean id="hello" class="com.demo.Hello">
    <property name="msg" ref="msg"/> 
</bean>
  • id/name:容器內唯一標識,可用逗號/分號/空格分隔多別名。
  • class:全限定類名。
  • 依賴注入方式:
    1. 構造器注入:<constructor-arg>,保證構造後即可用,強依賴首選。
    2. 屬性注入 (Setter):<property name="xxx" value/ref="..."/>,最常用,可選依賴。
    3. 工廠方法注入:factory-method + factory-bean/class,較少用。

三、進階配置特性

1. 集合屬性注入

<property name="list"> <list><value>a</value><ref bean="b"/></list> </property>
<property name="set"> <set>...</set> </property>
<property name="map"> <map><entry key="k" value="v"/></map> </property>
<property name="props"> <props><prop key="k">v</prop></props> </property>

2. p 命名空間簡化配置

<beans xmlns:p="https://www.springframework.org/schema/p">
    <bean id="hello" class="com.demo.Hello" p:msg="hello" p:msg-ref="msg"/>
</beans>

3. 自動裝配

  • autowire="byType":按類型匹配,多候選報錯。
  • autowire="byName":按屬性名匹配 Bean id。
  • 缺點:不可控、基本類型不生效、調試難。生產環境建議顯式配置。

4. Bean 繼承 (配置繼承)

<bean id="parent" class="com.demo.Person" p:name="Tom" p:age="20"/>
<bean id="child" parent="parent" p:name="Jerry"/> 

abstract="true" 僅作模板不實例化。

5. 作用域

scope含義場景
singleton容器內單例 (默認)無狀態服務、DAO、Controller
prototype每次 getBean 新建有狀態對象、命令對象
request/session/applicationWeb 作用域Web 相關組件

6. 外部屬性文件

<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="ComboPooledDataSource">
    <property name="jdbcUrl" value="${jdbcUrl}"/> ...
</bean>

7. Spring Expression Language (SpEL)

<property name="count" value="#{5}"/>
<property name="name" value="#{otherBean.name}"/>
<property name="max" value="#{T(java.lang.Math).max(1,2)}"/>
<property name="flag" value="#{systemProperties['os.name'].contains('Windows')}"/>

四、Bean 生命週期與擴展點

  1. 實例化 (構造器/工廠方法)
  2. 屬性填充 (DI)
  3. BeanPostProcessor.postProcessBeforeInitialization
  4. 初始化回調:@PostConstruct / InitializingBean.afterPropertiesSet() / init-method
  5. BeanPostProcessor.postProcessAfterInitialization (AOP 代理在此生成)
  6. Bean 就緒可用
  7. 容器關閉:銷毀回調 @PreDestroy / DisposableBean.destroy() / destroy-method

五、FactoryBean 與工廠模式

  • FactoryBean:實現 FactoryBean<T> 接口,getObject() 返回真實 Bean 實例。容器管理的是 FactoryBean 本身,getBean("id") 返回 getObject() 結果,getBean("&id") 返回 FactoryBean 實例。
  • 靜態工廠:class="FactoryClass" factory-method="staticMethod"。
  • 實例工廠:factory-bean="factoryInstance" factory-method="instanceMethod"。

六、基於注解的配置 (現代主流)

注解語義層級
@Component通用組件任意
@Repository持久層 (自動異常轉換)DAO
@Service業務層Service
@Controller表現層Web
<context:component-scan base-package="com.demo" 
    resource-pattern="**/service/*.class"> 
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

自動裝配注解

  • @Autowired:按類型裝配,構造器/字段/方法均可。required=false 允許缺失。配合 @Qualifier("beanName") 解決多候選。
  • @Resource:JSR-250,按名稱裝配 (name 屬性),其次類型。
  • @Inject:JSR-330,同 @Autowired 但無 required 屬性。
  • 推薦:構造器注入 + @Autowired (可省略),不可變、可測試、循環依賴可檢測。

七、總結

Spring IoC 以「容器管理 Bean 生命週期與依賴關係」為核心,從 XML 顯式配置演進至注解掃描與 JavaConfig,本質未變。掌握 BeanDefinition 解析、生命週期回調、後置處理器擴展機制、作用域與自動裝配原理,是深度使用 Spring、排查疑難雜症、設計擴展框架的關鍵。

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