gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:23:40 25 4
gpt4 key购买 nike

我目前有以下 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"/>

最佳答案

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

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>

关于java - 在原型(prototype) spring bean 中调用一次性(静态)初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16409089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com