2013-05-06 95 views
1

目前,我有以下的Spring bean定義:調用一次性(靜態)初始化

<bean id="myAwesomeBeanSetup" class="com.beanpckg.SuperBean" scope="singleton" init-method="doPreStep"/> 
<bean id="myAwesomeBean" class="com.beanpckg.SuperBean" scope="prototype" depends-on="myAwesomeBeanSetup"/> 

從本質上講,我需要的是運行SuperBean.doPreStep只有一次,但仍然有一個新的SuperBean實例用於後續調用。由於我有很多具有這種結構的bean,我想知道,是否有更好的方法來實現這一點,而不需要兩行定義?請注意,也可能是「跨豆」的依賴,例如:

<bean id="myAwesomeBeanSetup" class="com.beanpckg.SuperBean" scope="singleton" init-method="doPreStep"/> 
<bean id="myAwesomeBean2Setup" class="com.beanpckg.SuperBean2" scope="singleton" init-method="doPreStep"/> 
<bean id="myAwesomeBean" class="com.beanpckg.SuperBean" scope="prototype" depends-on="myAwesomeBeanSetup,myAwesomeBean2Setup"/> 

回答

2

你可以把你的代碼靜態初始化塊如下:

public class SuperBean { 
    // … 
    static { 
     doPreStep(); 
    } 

    public static void doPreStep() { 
    } 
} 

另外,如果你想有一個純Spring解決方案,可以實現FactoryBean並調用它的init方法doPreStep()如下:

public class SuperFactoryBean implements FactoryBean<SuperBean>{ 

    public void init() { 
     SuperBean.doPreStep(); 
    } 

    public boolean isSingleton() { 
     return false; 
    } 

    public SuperBean getObject(){ 
     return new SuperBean(); 
    } 

    public Class<SuperBean> getObjectType() { 
     return SuperBean.class ; 
    } 
} 

,並確定你的bean如下:

<bean id="myAwesomeBean" class="com.beanpckg.SuperFactoryBean" init-method="init"> 
</bean> 
0

根據要你真棒超內達到什麼:

對於我來說,這將是具有與通用代碼的獨立單身完美的用例,並自動裝配到你的原型。

既然你的init不會因每個bean的不同而不同,爲什麼在一個超類中呢?