2012-02-13 8 views
5

Mam pamięć podręczną klasy, która jest dość kosztowna w tworzeniu, ale potem jest ustawiona jako singleton i wstrzyknięta do mojej warstwy usługi.Guice: Unikaj leniwego wtrysku

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

Moim problemem jest to, że wydaje się publiczne() w Cache tylko wykonuje gdy próbuję uzyskać dostęp do jednego z jego metod

Czy mogę w jakiś sposób sprawiają, że obiekt się zbudowana na starcie serwera, a nie?

Odpowiedz

9

Tak, wiążą go za pomocą .asEagerSingleton():

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

Należy zauważyć, że zgodnie z tym linkiem, Guice będzie chętnie utworzyć wszystkie Singleton s jeśli jest prowadzony w fazie PRODUCTION (to leniwie tworzy je w fazie DEVELOPMENT szybsze wdrożenie testowe). Można określić Stage podczas tworzenia Injector:

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

niesamowite, nie miałem pojęcia, w jaki sposób stosować scenie. Dziękuję za aktualizację odpowiedzi – javaNoober