2016-10-07 108 views
0

我正在嘗試學習Dagger2,但模塊即將推出,因爲已棄用。 我從以下教程http://www.vogella.com/tutorials/Dagger/article.html 這是我的代碼如下。Dagger2模塊未注入其他模塊或已棄用

public class TestApp { 

    @Inject 
    BackendService backendService; 

    private void testServer() { 
     BackendComponent backendComponent = DaggerBackendComponent.builder() 
       .build(); 
     backendComponent.inject(this); 
     backendService.call(); 
    } 

    public static void main(String[] args) { 
     new TestApp().testServer(); 
    } 
} 

UserModule其注入不工作

@Module 
public class UserModule { 

    @Provides 
    @Singleton 
    User providesUser() { 
     return new User("John", "Doe"); 
    } 
} 

BackendService

public class BackendService { 

    @Inject 
    public User user; 

    private String serverUrl; 

    @Inject 
    public BackendService(@Named("serverUrl") String serverUrl) { 
     this.serverUrl = serverUrl; 
    } 

    public boolean call() { 
     if (user != null && serverUrl != null && serverUrl.length() > 0) { 
      System.out.println("User: " + user.toString()); 
      return true; 
     } else { 
      System.err.println("User: " + user); 
      System.err.println("ServerUrl: " + serverUrl); 
      return false; 
     } 
    } 

} 

BackendServiceModule

@Module 
public class BackendServiceModule { 

    @Provides 
    @Singleton 
    BackendService proviedBackendServiceModule(@Named("serverUrl") String serverUrl) { 
     return new BackendService(serverUrl); 
    } 

    @Provides 
    @Named("testUrl") 
    String provideAnotherUrl() { 
     return "http://www.facebook.com"; 
    } 

    @Provides 
    @Named("serverUrl") 
    String provideServerUrl() { 
     return "http://www.google.com"; 
    } 

} 

BackendComponent

@Singleton 
@Component(modules = {UserModule.class, BackendServiceModule.class}) 
public interface BackendComponent { 


    BackendService proviedBackendServiceModule(); 

    void inject(TestApp app); 

} 

我運行後得到的輸出如下:

User: null 
ServerUrl: http://www.google.com 

,如果我嘗試下面的代碼及其工作

public class TestApp { 

    @Inject 
    User user; 
    @Inject 
    BackendService backendService; 

    private void testServer() { 
     BackendComponent backendComponent = DaggerBackendComponent.builder() 
       .build(); 
     backendComponent.inject(this); 
     backendService.call(); 
     System.out.println("User: " + user); 
    } 


    public static void main(String[] args) { 
     new TestApp().testServer(); 
    } 
} 

User: null 
ServerUrl: http://www.google.com 
User: User [firstName=John, lastName=Doe] 
+0

請提供BackendComponent的代碼。 – Jacob

+0

@Jacob我已經添加了BackendComponent代碼,請檢查。 – sector11

回答

1

的原因你的問題是匕首的工作方式。它只會注入用@Inject註釋的字段,該字段是您指定爲注入方法參數的類。因此,用@Inject註釋的BackendService內部沒有任何內容會被注入。

public class TestApp { 

    @Inject <-- this is injected 
    User user; 
    @Inject <-- this is injected 
    BackendService backendService; <-- Nothing inside this class will be injected 

我建議將你的用戶對象傳遞給構造函數中的BackendService。只是這樣做的這樣:

@Provides 
    @Singleton 
    BackendService proviedBackendServiceModule(@Named("serverUrl") String serverUrl, User user) { 
     return new BackendService(serverUrl, user); 
    } 

另一種解決方案是定義你的組件內部的BackendService的注射方法,但它會得到解決的組件對象凌亂的傳球。

+0

謝謝@Jacob – sector11