简体   繁体   English

Dagger2无法在注入的类中注入字段

[英]Dagger2 can't inject field inside injected class

I was trying to playaround with dagger2 but I got problems with field injection, and here is my code. 我试图使用dagger2进行变通,但是我遇到了字段注入问题,这是我的代码。

POJO classes : POJO类:

// User.java
public class User {
    private String firstName, lastName;
    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

The class which I can't inject the user field. 我无法注入user字段的类。

//BackendService.java
public class BackendService {
    @Inject
    public User user; // Not injected -> Null

    @Inject
    public BackendService() {
    }
}

User provider class 用户提供者类

// UserModule.java
@Module
public class UserModule {

    @Provides
    @Singleton
    User providesUser() {
        return new User("AA","BB");
    }
}

Backend provider class 后端提供程序类

// BackendServiceModule.java
@Module
public class BackendServiceModule {
    @Provides
    BackendService provideBackendService() {
        return new BackendService();
    }    
}

And last but not least, the component 最后但并非最不重要的是,组件

// ApplicationComponent.java
@Component(modules = {UserModule.class, BackendServiceModule.class})
public interface ApplicationComponent {
    BackendService provideBackendService();
    void inject(ConsumerMain consumerMain);
}

The problem is that in BackendService.java the field user doesn't get injected. 问题在于,在BackendService.java中,不会注入现场user

Injection is working properly on BackendService 注入在BackendService正常工作

Delete your @Provides BackendService method. 删除您的@Provides BackendService方法。

When you call new BackendService() , you're telling Dagger "don't worry about how to create a BackendService, I can do it for you". 当您调用new BackendService() ,您在告诉Dagger“不用担心如何创建BackendService,我可以为您做到”。 That also prevents Dagger from calling @Inject -annotated constructors and methods, or populating @Inject -annotated fields. 这也防止Dagger调用@Inject注释的构造函数和方法,或填充@Inject注释的字段。

When you delete that method, Dagger will inspect BackendService to learn how to instantiate it itself, at which point it will see your @Inject constructor and field and use them to construct a BackendService when needed. 当您删除该方法时,Dagger将检查BackendService来学习如何实例化它本身,这时它将看到您的@Inject构造函数和字段,并在需要时使用它们来构造BackendService。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM