2012-02-13 10 views
5

Ho una cache di classe che è piuttosto costosa da creare, ma dopo è impostata come un singleton e iniettata nel mio livello di servizio.Guice: evitare l'iniezione pigra

@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 
} 

Il mio problema è che sembra pubblica() in cache solo esegue quando sto cercando di accedere a uno dei suoi metodi

Posso in qualche modo rendere l'oggetto ottenere costruito su di avvio del server, invece?

risposta

9

Sì, si legano usando .asEagerSingleton():

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

Si noti che in base a tale collegamento, Guice saranno avidamente creare tutti Singleton s se essere eseguito in PRODUCTION fase (è pigramente li crea nella DEVELOPMENT palco per una più rapida test di implementazione). È possibile specificare il Stage durante la creazione del Injector:

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

impressionante, non avevo idea su come applicare stage. Grazie per aver aggiornato la risposta – javaNoober