簡體   English   中英

如何在Guice中進行渴望的單例初始化

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM