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”依赖关系,例如:

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

2 回答 2

2

您可以将代码放在静态初始化块中,如下所示:

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

    public static void doPreStep() {
    }
}

或者,如果您想要一个纯Spring解决方案,您可以实现 aFactoryBean并在其 init 方法中调用doPreStep()in,如下所示:

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>
于 2013-05-07T01:12:21.930 回答
0

取决于你想在你的超类中实现什么:

对我来说,这将是一个完美的用例,它拥有一个带有公共代码的单独单例并将其自动装配到您的原型中。

由于每个 bean 的 init 不会有所不同,为什么将它放在超类中?

于 2013-05-07T05:15:08.450 回答