Dagger2 如何执行具有默认构造函数依赖性的构造函数注入
Dagger2 How to perform constructor injection which has dependency of a default constructor
我想请问如何注入没有任何参数的构造函数。我遇到过这个问题,但找不到解决方案。
这是我的回购 class
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;
}
}
现在在我的主 activity 中,我正在注入 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。
@Module
abstract class UrlModule {
@Binds
abstract UrlsSource bindUrlsSource(LocalUrlsSource source);
}
然后您将创建一个使用此模块的组件并注入您的 activity。
@Component(modules = {UrlModule.class})
@Singleton
public interface AppComponent {
void inject(MainActivity activity);
}
然后在您的 Application.java class 中启动组件并在您的 activity 中检索它并调用 inject(),例如像这样。
public final class MainApplication extends Application {
private static AppComponent appComponent;
public static AppComponent getAppComponent() {
return appComponent;
}
private static AppComponent createAppComponent(Application application) {
return DaggerAppComponent.create();
}
@Override
public void onCreate() {
super.onCreate();
appComponent = createAppComponent(this);
}
}
然后你会像这样注入依赖。
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);
// Injects this activity.
MainApplication.getAppComponent().inject(this);
}
}
我想请问如何注入没有任何参数的构造函数。我遇到过这个问题,但找不到解决方案。 这是我的回购 class
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;
}
}
现在在我的主 activity 中,我正在注入 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。
@Module
abstract class UrlModule {
@Binds
abstract UrlsSource bindUrlsSource(LocalUrlsSource source);
}
然后您将创建一个使用此模块的组件并注入您的 activity。
@Component(modules = {UrlModule.class})
@Singleton
public interface AppComponent {
void inject(MainActivity activity);
}
然后在您的 Application.java class 中启动组件并在您的 activity 中检索它并调用 inject(),例如像这样。
public final class MainApplication extends Application {
private static AppComponent appComponent;
public static AppComponent getAppComponent() {
return appComponent;
}
private static AppComponent createAppComponent(Application application) {
return DaggerAppComponent.create();
}
@Override
public void onCreate() {
super.onCreate();
appComponent = createAppComponent(this);
}
}
然后你会像这样注入依赖。
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);
// Injects this activity.
MainApplication.getAppComponent().inject(this);
}
}