2014-12-15 18 views
7

Ben fark bir yöntem üzerinde @provides kullanarak ve benim guice modüllerde bind() kullanma arasında ne olduğunu merak ediyorum.Guice @provides ve bind() arasında bir fark var mı?


Genellikle AbstractModule.configure (geçersiz kılmak) ve bunun gibi benim arayüzleri için bütün uygulamaları bağlamak:, öyle olsa şu anda nerede ile çalışıyorum kod temeli bir desen Ancak

public class MyModule extends AbstractModule 
{ 
    @Override 
    protected void configure() 
    { 
    this.bind(myIface.class).to(myIfaceImpl.class); 
    this.bind(myOtherIface.class).to(myOtherIfaceImpl.class).asEagerSingleton(); 
    } 
    ... 
} 

uygulamalar açıkça bağlı olmayan bu gibi sağlayıcılarından iade ediliyor:

public class MyModule extends AbstractModule 
{ 
    @Provides 
    @Singleton 
    myIface iFaceProvider() 
    { 
    return new myIfaceImpl(); 
    } 
    ... 
} 

Biri diğerini tercih etmek için bir sebep var mı? Belirli bir yöntemi zorlayan durumlar var mı? Eğer

bind(MyInterface.class).to(MyImplementation.class) 

yaparsanız

cevap

8

Guice sizin için bir örneğini oluşturur. Bu AOP gibi certiain şeyleri sağlar. Eğer

@Provides 
MyInterface provideMyInterface() { 
    return new MyImplementation(); 
} 

yaparsanız AOP çalışmaz öyleyse Guice örneğini yaratmadı. Ayrıca, MyImplementation için erişilebilir bir kurucu gerektirir. Genellikle, bu form sadece Guice-uyumlu yapmak için MyImplementation düzenleyemediğinizde kullanılır.

@Provides 
MyInterface provideMyInterface(MyImplementation impl) { 
    return impl; 
} 

neredeyse tamamen eşdeğer bind(...).to(...) forma geçerli:

üçüncü formu yok. Genellikle, Dagger gibi bind sözdizimine sahip olmayan çerçevelerde kullanılır.

+0

Tüm bunların javax.inject ile ilişkisi nasıl? Ne kodunuzda ne de OP'lerde ne ek açıklamaların alındığını görürüz; Yanılmıyorsam bunun bir etkisi olabilir mi? – fge

+0

Fark olmamalıdır. Bildiğim tek fark Guice, 'javax.inject.Inject' ile' final 'alanlarına enjekte etmeyi reddedecektir, ancak' @ com.google.inject.Inject' ile çalışacaktır. –

+0

@fge Ayrıca javax.inject.Provides 'yoktur –

İlgili konular