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

Spring 3 核心:Bean 定義、建構方式、作用域與生命週期完整指南

     編輯:Java 綜合教學

環境建置

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.2.16.RELEASE</version>
</dependency>

資源目錄建立 spring.xml,啟動容器:

ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");

四種 Bean 建構方式

1. 預設建構子 (無參數)

public class Juggler implements Performer {
    private int beanBags = 3;
    public Juggler() {}
    public Juggler(int beanBags) { this.beanBags = beanBags; }
    public void perform() { System.out.println("JUGGLING " + beanBags + " BEANBAGS"); }
}

<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler" />

2. 含參數建構子注入

<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler">
    <constructor-arg value="15" /> <!-- 基本型別 -->
</bean>

3. 物件參考注入 (建構子)

public class PoeticJuggler extends Juggler {
    private Poem poem;
    public PoeticJuggler(int beanBags, Poem poem) {
        super(beanBags);
        this.poem = poem;
    }
    @Override public void perform() {
        super.perform();
        poem.recite();
    }
}

<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi" />
<bean id="poeticDuke" class="cn.edu.hdu.sia.chapter2.PoeticJuggler">
    <constructor-arg value="15" />
    <constructor-arg ref="jingyesi" /> <!-- 物件參考 -->
</bean>

進階屬性:index (參數索引)、type (參數型別)、name (參數名稱,需編譯時保留參數名 -parameters)

4. 工廠方法建構 (單例模式等)

public class Stage {
    private Stage() {}
    private static class Holder { static Stage stage = new Stage(); }
    public static Stage getInstance() { return Holder.stage; }
    public void printDescription() { System.out.println("this is a stage."); }
}

<bean id="theStage" class="cn.edu.hdu.sia.chapter2.Stage" factory-method="getInstance" />

亦可用 factory-bean 指定工廠 Bean 實例,搭配 factory-method。

Bean 作用域

Scope說明適用場景
singleton (預設)Spring 容器內單一實例無狀態服務、DAO、Controller
prototype每次注入/查詢建立新實例有狀態物件、命令模式、每次請求新實例
request單一 HTTP 請求生命週期Web 專用,請求級資料
sessionHTTP Session 生命週期Web 專用,用戶級資料
globalSessionPortlet 全域 SessionPortlet 環境
<bean id="myBean" class="..." scope="prototype" />

Bean 生命週期回調

  1. 實例化 (建構子/工廠方法)
  2. 屬性注入 (Setter/建構子)
  3. 初始化回調:@PostConstruct / init-method / InitializingBean.afterPropertiesSet()
  4. Bean 就緒可用
  5. 銷毀回調 (僅 Singleton):@PreDestroy / destroy-method / DisposableBean.destroy()
<bean id="myBean" class="..." init-method="init" destroy-method="cleanup" />

依賴注入方式補充

  • Setter 注入:<property name="xxx" ref="yyy" />
  • 建構子注入:<constructor-arg> (推薦,不可變、強制依賴)
  • p-namespace 簡寫:xmlns:p="https://www.springframework.org/schema/p" → p:xxx-ref="yyy"
  • 自動裝配:autowire="byName|byType|constructor" (不建議大量使用,降低可讀性)

循環依賴處理

Spring 透過三級快取解決 Singleton 循環依賴 (Setter/Field 注入): singletonObjects (完成) → earlySingletonObjects (早期曝光) → singletonFactories (ObjectFactory)。 建構子循環依賴無法解決,需重構設計或改用 Setter/注解注入。

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