[英]how to do eager singleton initialization in Guice
如何在Guice中進行急切的單例初始化。 我在春季以下列方式完成了工作:
<!-- Scheduler to run the artifact metadata refresher. -->
<bean id="springTest" class="org.springframework.beans.factory.config.MethodInvokingBean"
scope="singleton">
<property name="targetObject" ref="initializer"/>
<property name="targetMethod" value="createScheduler" />
<property name="arguments">
<list>
.... define arguments
/***final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs
**/
</list>
</property>
</bean>
但是在吉斯:
如果我這樣做:
@Singleton
@Inject
public void provideArtifactRefresherScheduler(
final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs
) {
new StaggeredScheduler(
test" /* name of the scheduler.*/,
StaggeredScheduler.ScheduleStrategy.FIXED_RATE /* scheduler strategy to be used */,
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
這是行不通的。 在Guice中,我希望在服務啟動后立即實例化StaggeredScheduler。 注意:StaggeredScheduler構造函數可啟動調度程序的啟動(該代碼不在我的控制范圍內)
請提出建議。
在Guice模塊的configure()
方法中,將類綁定為渴望的單例。
protected void configure() {
bind(StaggeredScheduler.class).toProvider(StaggeredSchedulerProvider.class).asEagerSingleton();
}
並實現Provider<StaggeredScheduler>
。 例如:
public class StaggeredSchedulerProvider implements Provider<StaggeredScheduler> {
@Inject
public StaggeredSchedulerProvider(final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs) {
this.fixedInitialDelayInSecs = fixedInitialDelayInSecs;
this.maxRandomScheduledDelayInSecs = maxRandomScheduledDelayInSecs;
this.schedulePeriodInSecs = schedulePeriodInSecs;
this.artifactRefresherTask = artifactRefresherTask;
this.awaitTerminationInSecs = awaitTerminationInSecs;
}
public StaggeredScheduler get() {
new StaggeredScheduler(
"test", /* name of the scheduler.*/
StaggeredScheduler.ScheduleStrategy.FIXED_RATE, /* scheduler strategy to be used */
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
}
一個更快捷,更骯臟的技巧是將其添加到您的Guice模塊:
@BindingAnnotation
@Retention(RUNTIME)
private @interface PrivateBindingAnnotation {}
protected void configure() {
bind(StaggeredScheduler.class).annotatedWith(PrivateBindingAnnotation.class).to(StaggeredScheduler.class).asEagerSingleton();
}
@Provides
@Singleton
public StaggeredScheduler provideArtifactRefresherScheduler(
final Runnable artifactRefresherTask,
final long fixedInitialDelayInSecs,
final int maxRandomScheduledDelayInSecs,
final long schedulePeriodInSecs,
final long awaitTerminationInSecs) {
new StaggeredScheduler(
test" /* name of the scheduler.*/,
StaggeredScheduler.ScheduleStrategy.FIXED_RATE /* scheduler strategy to be used */,
fixedInitialDelayInSecs,
maxRandomScheduledDelayInSecs,
schedulePeriodInSecs,
artifactRefresherTask,
true,
awaitTerminationInSecs);
}
無論哪種情況,都需要確保您確實能夠將所需的值注入Provider或@Provides
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.