簡體   English   中英

在原型Spring bean中調用一次(靜態)初始化

[英]Invoke a one-time (static) initialization in a prototype spring bean

我目前有以下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”依賴性,例如:

<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"/>

您可以將代碼放入靜態初始化塊中,如下所示:

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>

根據您想要在超棒超類中實現的目標:

對我來說,這是一個完美的用例,將一個單獨的單例與通用代碼並自動連接到您的原型中。

由於每個bean的init不會不同,因此為什么要在超類中包含它?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM