在原型spring bean中调用一次性(静态)初始化

时间:2013-05-06 23:53:14

标签: java spring

我目前有以下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 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

根据你想要在你真棒超类中实现的目标:

对我而言,这将是使用公共代码单独单独并将其自动装入原型的完美用法。

由于你的init不会因为每个bean的不同而导致为什么在超类中使用它?