2012-02-13 27 views
5

Tôi có một lớp Cache mà khá tốn kém để tạo, nhưng sau đó được thiết lập như là một singleton và được tiêm vào lớp dịch vụ của tôi.Guice: Tránh tiêm lười

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

Vấn đề của tôi là có vẻ như công chúng() trong bộ nhớ cache chỉ thực hiện khi tôi đang cố gắng để truy cập vào một trong những phương thức của nó

Tôi có thể bằng cách nào đó làm cho các đối tượng được xây dựng trên khởi động máy chủ để thay thế?

Trả lời

9

Vâng, ràng buộc nó bằng cách sử .asEagerSingleton():

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

Lưu ý rằng theo liên kết đó, Guice sẽ háo hức tạo mọi Singleton s nếu được chạy trong giai đoạn PRODUCTION (nó uể oải tạo họ trong giai đoạn DEVELOPMENT cho nhanh triển khai thử nghiệm). Bạn có thể chỉ định Stage khi tạo Injector:

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

tuyệt vời, tôi không biết cách áp dụng Giai đoạn. Cảm ơn bạn đã cập nhật câu trả lời – javaNoober

Các vấn đề liên quan