Guice:避免懒惰注射

时间:2012-02-13 03:59:23

标签: guice

我有一个类Cache,创建起来非常昂贵,但之后设置为单例并注入我的服务层。

@Override
protected void configure() {            
    bind(Cache.class).in(Singleton.class);

    bind(Service.class).to(ServiceImpl.class).in(Singleton.class);      
}

@Inject
    public ServiceImpl(Cache cache){
        this.cache = cache;
    }

public Cache(){
//Expensive stuff
}

我的问题是,当我尝试访问其中一个方法时,Cache中的public()似乎只会执行

我可以以某种方式使对象在服务器启动时构建吗?

1 个答案:

答案 0 :(得分:14)

是的,使用.asEagerSingleton()绑定它:

bind(Service.class).to(ServiceImpl.class).asEagerSingleton(); 

请注意,根据该链接,Guice如果在Singleton阶段运行,则会热切地创建所有PRODUCTION(它会在DEVELOPMENT阶段懒洋洋地创建它们更快的测试部署)。您可以在创建Stage时指定Injector

Injector injector = Guice.createInjector(Stage.PRODUCTION, new MyModule());