<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.16.RELEASE</version> </dependency>
首先,寫一個雜技師類;
package cn.edu.hdu.sia.chapter2; public class Juggler implements Performer { private int beanBags = 3; public Juggler() { } public Juggler(int beanBags) { this.beanBags = beanBags; } public void perform() throws PerformanceException { System.out.println("JUGGLING " + beanBags + " BEANBAGS"); } } View Code在spring配置文件中聲明該雜技師Bean(未配置<constructor-arg>,將使用默認構造方法);
<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler"> </bean>
在main方法中使用該雜技師bean;
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); Performer performer = (Performer) ctx.getBean("duke"); performer.perform(); }
構造方法參數為基本數據類型的情況
接著上例的例子,可以在配置bean的時候,往構造方法傳入參數,如下配置,將調用public Juggler(int beanBags)構造方法創建雜技師bean;
<bean id="duke" class="cn.edu.hdu.sia.chapter2.Juggler"> <constructor-arg value="15" /> </bean>
構造方法參數為對象引用類型的情況
現在,我們將要給雜技師增加吟詩行為;
先定義一個詩歌背誦接口:
package cn.edu.hdu.sia.chapter2; public interface Poem { public void recite(); }
再寫一個吟詩實現類:
package cn.edu.hdu.sia.chapter2; public class JingYeSi implements Poem{ public void recite() { System.out.println("床前明月光~"); } }
然後編寫吟詩雜耍類:
package cn.edu.hdu.sia.chapter2; public class PoeticJuggler extends Juggler { private Poem poem; public PoeticJuggler(int beanBags, Poem poem) { super(beanBags); this.poem = poem; } /** * @see cn.edu.hdu.sia.chapter2.Juggler#perform() * @throws PerformanceException */ @Override public void perform() throws PerformanceException { super.perform(); poem.recite(); } } View Code在spring配置文件中聲明該雜技師Bean,注意構造方法的第二個參數為對象引用,引用id為“jingyesi”的bean;
可以用index屬性指定構造方法參數索引下標,type指定構造方法參數類型,name指定構造方法參數名,用於區分不同的參數;
<bean id="jingyesi" class="cn.edu.hdu.sia.chapter2.JingYeSi"> </bean> <bean id="poeticDuke" class="cn.edu.hdu.sia.chapter2.PoeticJuggler"> <constructor-arg value="15" /> <constructor-arg ref="jingyesi" /> </bean>
最後參考前面寫的main方法測試perform的執行情況,發現該雜技師Bean不僅能雜耍,還能吟詩;
當構造方法為私有的時候,是不能夠通過構造方法創建bean的,這時候一般通過工廠方法創建,如下為一個典型的單例類,其構造方法為私有屬性:
package cn.edu.hdu.sia.chapter2; public class Stage { private Stage() { } private static class StageSingletonHolder { static Stage stage = new Stage(); } public static Stage getInstance() { return StageSingletonHolder.stage; } public void printDescription(){ System.out.println("this is a stage."); } }
要創建該bean,需要在spring配置文件中做如下配置:
可以用factory-bean屬性設置指定的工廠bean,用<constructor-arg>標簽往factory-method傳入參數;
<bean id="theStage" class="cn.edu.hdu.sia.chapter2.Stage" factory-method="getInstance" />
所有的bean在spring上下文范圍內默認都是“單例”的,即只有一個實例,注意,這裡的單例指的是spring上下文范圍內的單例;要修改該配置項,只需要配置scope屬性,scope默認是singleton,可配置的屬性值如下列表: