<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.16.RELEASE</version>
</dependency>
資源目錄建立 spring.xml,啟動容器:
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
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" />
<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler">
<constructor-arg value="15" /> <!-- 基本型別 -->
</bean>
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)
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。
| Scope | 說明 | 適用場景 |
|---|---|---|
singleton (預設) | Spring 容器內單一實例 | 無狀態服務、DAO、Controller |
prototype | 每次注入/查詢建立新實例 | 有狀態物件、命令模式、每次請求新實例 |
request | 單一 HTTP 請求生命週期 | Web 專用,請求級資料 |
session | HTTP Session 生命週期 | Web 專用,用戶級資料 |
globalSession | Portlet 全域 Session | Portlet 環境 |
<bean id="myBean" class="..." scope="prototype" />
@PostConstruct / init-method / InitializingBean.afterPropertiesSet()@PreDestroy / destroy-method / DisposableBean.destroy()<bean id="myBean" class="..." init-method="init" destroy-method="cleanup" />
<property name="xxx" ref="yyy" /><constructor-arg> (推薦,不可變、強制依賴)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/注解注入。