我正在尝试学习Dagger2,但是模块已弃用。
我正在按照http://www.vogella.com/tutorials/Dagger/article.html的教程
这是我的代码如下。

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");
    }
}


后端服务

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";
    }

}


后端组件

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

最佳答案

您遇到问题的原因是匕首的工作方式。它仅在您指定为inject方法参数的类上注入使用@Inject注释的字段。因此,不会在您的BackendService内部添加@Inject注释的任何内容。

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定义一个注入方法,但是在组件对象周围传递时会变得混乱。

08-26 18:26