Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dagger2模块未被注入其他模块或已弃用_Java_Dependency Injection_Dagger 2 - Fatal编程技术网

Java Dagger2模块未被注入其他模块或已弃用

Java Dagger2模块未被注入其他模块或已弃用,java,dependency-injection,dagger-2,Java,Dependency Injection,Dagger 2,我正试图学习Dagger2,但该模块已被弃用。 我是从以下教程 下面是我的代码 public class TestApp { @Inject BackendService backendService; private void testServer() { BackendComponent backendComponent = DaggerBackendComponent.builder() .build();

我正试图学习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();
    }
}
注入不工作的用户模块

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

}
后端服务模块

@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注释的字段。因此,将不会注入后端服务中带有@Inject注释的任何内容

public class TestApp {

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

另一种解决方案是在组件内部为后端服务定义注入方法,但传递组件对象时会变得混乱。

问题的原因是dagger的工作方式。它只在指定为Inject方法参数的类上注入用@Inject注释的字段。因此,将不会注入后端服务中带有@Inject注释的任何内容

public class TestApp {

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

另一个解决方案是在组件内部为后端服务定义一个注入方法,但传递组件对象时会变得混乱。

请提供后端组件的代码。@Jacob我现在添加了后端组件代码,请检查。请提供后端组件的代码。@Jacob我现在添加了后端组件代码,请检查。