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

Spring IoC 實戰全攻略:XML 與註解裝配、Bean 生命周期、依賴注入、SpEL 表達式

     編輯:Java 綜合教學

Spring IoC 實戰全攻略

Spring 以 IoC(控制反轉)與 AOP 為核心,本文系統講解基於 XML 與註解的 Bean 裝配、三種實例化方式、作用域、生命周期回調、後置處理器、四種依賴注入方式、集合注入、SpEL 表達式、註解掃描與混合配置最佳實踐。

一、核心概念

  • IoC:將對象創建與依賴管理交給容器,通過工廠+反射+配置實現解耦。
  • DI:容器在提供 Bean 時,遞歸注入其依賴的其他 Bean(Controller→Service→DAO)。

二、Maven 核心依賴

<dependencies>
    <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>
    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version></dependency>
</dependencies>

三、XML 裝配詳解

1. 三種實例化方式

<!-- 構造器(默認無參) -->
<bean id="constructBean" class="com.example.ConstructBean"/>

<!-- 靜態工廠方法 -->
<bean id="staticBean" class="com.example.StaticBeanFactory" factory-method="getInstance"/>

<!-- 實例工廠方法 -->
<bean id="beanFactory" class="com.example.InstanceBeanFactory"/>
<bean id="instanceBean" factory-bean="beanFactory" factory-method="getInstance"/>

2. Bean 作用域

scope說明
singleton容器單例(默認)
prototype每次 getBean 創建新實例
request/session/globalSessionWeb 環境下按請求/會話/全局會話
<bean id="protoBean" class="com.example.ProtoBean" scope="prototype"/>

3. 生命周期回調

public class LifecycleBean {
    public void setUp() { System.out.println("SetUp..."); }
    public void tearDown() { System.out.println("TearDown..."); }
}
<bean id="lifeBean" class="com.example.LifecycleBean" init-method="setUp" destroy-method="tearDown"/>

測試關鍵:需使用 ClassPathXmlApplicationContext 並調用 close() 觸發銷毀。

4. 後置處理器

public class PrintBeanProcessor implements BeanPostProcessor {
    @Override public Object postProcessBeforeInitialization(Object bean, String name) {
        if ("lifeBean".equals(name)) System.out.println("Before init: " + name);
        return bean;
    }
    @Override public Object postProcessAfterInitialization(Object bean, String name) {
        System.out.println("After init: " + name);
        return bean;
    }
}
<bean class="com.example.PrintBeanProcessor"/> <!-- 無需 id -->

應用:AOP 自動代理、Bean 驗證、動態賦值。

5. 依賴注入四種方式

方式XML 示例適用場景
構造器注入<constructor-arg index="0" value="foo"/>強制依賴、不可變對象
Setter 注入<property name="name" value="foo"/>可選依賴、JavaBean 慣例
p 命名空間<bean p:name="foo" p:age-ref="ageBean"/>簡化 Setter 注入(Spring 2.5+)
SpEL 表達式<property name="name" value="#{car.owner}"/>引用 Bean/屬性/方法/運算

6. 集合屬性注入

<property name="list">
    <list><value>a</value><value>b</value></list>
</property>
<property name="set">
    <set><value>1</value><value>2</value></set>
</property>
<property name="map">
    <map><entry key="k1" value="v1"/></map>
</property>
<property name="props">
    <props><prop key="k1">v1</prop></props>
</property>

四、註解裝配

1. 組件掃描

<context:component-scan base-package="com.example"/>

等價於 <context:annotation-config/> + 自動掃描 @Component 衍生註解:

註解語義層
@ControllerWeb 控制層
@Service業務服務層
@Repository數據訪問層
@Component通用組件

2. 作用域與生命周期

@Component
@Scope("prototype")
public class ProtoBean {
    @PostConstruct public void init() { ... }
    @PreDestroy public void destroy() { ... }
}

3. 依賴注入註解

註解特性
@Value基本值/SpEL:@Value("#{car.price * 1.1}")
@Autowired按類型自動裝配,配合 @Qualifier 指定 Bean 名
@ResourceJSR-250,按名稱裝配(name 屬性),次按類型

五、XML 與註解混合最佳實踐

  • 第三方 Bean(DataSource、RedisTemplate 等)用 XML 顯式配置,便於環境差異化管理。
  • 業務 Bean 用註解掃描,開發效率高。
  • 只需在 XML 中保留 <context:component-scan> 即可激活註解處理器。

六、容器類型選擇

容器特點
BeanFactory核心工廠接口,延遲初始化(getBean 時創建)。
ApplicationContextBeanFactory 子接口,啟動時預實例化單例,支援國際化、事件發布、多環境 Profile、Web 整合。

實際開發中統一使用 ApplicationContext(ClassPathXmlApplicationContext / AnnotationConfigApplicationContext)。

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