Android Dagger2如何执行依赖于默认构造函数的构造函数注入

Android Dagger2如何执行依赖于默认构造函数的构造函数注入,android,dagger-2,Android,Dagger 2,我想问一下如何注入一个没有任何参数的构造函数。我遇到过这个问题,但找不到解决办法。 这是我的回购课程 public class UrlsRepository { private UrlsSource urlsSource; @Inject public UrlsRepository(UrlsSource urlsSource){ this.urlsSource = urlsSource; } public String getLand

我想问一下如何注入一个没有任何参数的构造函数。我遇到过这个问题,但找不到解决办法。 这是我的回购课程

public class UrlsRepository {

    private UrlsSource urlsSource;

    @Inject
    public UrlsRepository(UrlsSource urlsSource){
        this.urlsSource = urlsSource;
    }

    public String getLandingUrl(){
        return urlsSource.getLoginUrl();
    }

    public String[] getDashboardUrls(){
        return urlsSource.getDashboardUrls();
    }
}
这里是界面

public interface UrlsSource{
    String getLoginUrl();

    String[] getDashboardUrls();
}
下面是实现

@Singleton
public class LocalUrlsSource implements UrlsSource {

    @Inject
    public LocalUrlsSource(){}

    @Override
    public String getLoginUrl() {
        return Properties.LOGIN_URL;
    }

    @Override
    public String[] getDashboardUrls() {
        return Properties.DASHBOARD_URLS;
    }
}
现在在我的主要活动中,我正在注入UrlsRepository,但它是空的。请导游

public class MainActivity extends Activity implements MainPresenter.View {

    @Inject
    UrlsRepository urlsRepository;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
    }
}

如果您不想像这样注入接口,您需要创建一个带有@Binds注释方法的@Module,如下所示

@模块
抽象类URL模块{
@束缚
抽象UrlsSource bindUrlsSource(本地UrlsSource源);
}
然后您将创建一个使用此模块的组件,并将其注入到您的活动中

@Component(modules = {UrlModule.class})
@Singleton
public interface AppComponent {

    void inject(MainActivity activity);
}
然后在Application.java类中启动该组件,并在活动中检索它,然后调用inject(),例如如下所示

public final class main应用程序扩展应用程序{
私有静态AppComponent;
公共静态AppComponent getAppComponent(){
返回appComponent;
}
私有静态AppComponent createAppComponent(应用程序){
返回DaggerAppComponent.create();
}
@凌驾
public void onCreate(){
super.onCreate();
appComponent=createAppComponent(此);
}
}
然后像这样注入依赖项

公共类MainActivity扩展活动实现MainPresenter.View{
@注入
UrlsRepository UrlsRepository;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注入此活动。
MainApplication.getAppComponent().inject(此);
}
}

我没有看到
AndroidInjection.Injection(这个)
在您的主要活动中?我没有注入任何android组件,即活动或片段。因此,AndroidInjection不适用于我的情况。如果Dagger不创建对象(构造函数注入与创建活动的Android框架),那么在创建对象后,您必须使用组件(通常是
组件。注入(这)
调用您在示例中看到的)手动注入对象。Dagger为
@Inject
注释字段生成代码,但也需要调用此代码。@DavidMedenjak但在我的情况下,我不能使用组件,因为我没有任何模块来提供依赖项。或者,如果我遗漏了什么,你可以发布代码片段。@eCDroid请看下面我的答案,也许会有帮助。谢谢你的回答。你能解释一下“绑定”的目的吗?@eCDroid太好了!这里有一篇很好的文章解释了提供和绑定之间的区别。