[英]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.