Java Android dagger2模块无法注入其他模块
我正在努力学习如何使用匕首。您是否应该为您拥有的每个模块制作一个组件(然后在“超级组件”中组合组件) 我有两个模块可以工作,他们以前有单独的组件。然后我添加了一个额外的模块(没有组件),在新模块中,我的@Inject似乎不起作用 如何使我的AppModule能够注入到我的新GyroModule中 我的新“陀螺”模块:Java Android dagger2模块无法注入其他模块,java,android,dagger,dagger-2,Java,Android,Dagger,Dagger 2,我正在努力学习如何使用匕首。您是否应该为您拥有的每个模块制作一个组件(然后在“超级组件”中组合组件) 我有两个模块可以工作,他们以前有单独的组件。然后我添加了一个额外的模块(没有组件),在新模块中,我的@Inject似乎不起作用 如何使我的AppModule能够注入到我的新GyroModule中 我的新“陀螺”模块: @Module public class GyroModule implements SensorEventListener { @Inject AppModule _appMod
@Module
public class GyroModule implements SensorEventListener {
@Inject AppModule _appModule; // NULL
private SensorEvent _lastReading;
private SensorManager _sensorManager;
private Sensor _gyro;
@Inject
public GyroModule() {
initialize();
}
@Provides
@Singleton
public GyroModule provideGyroModule() {
return this;
}
@Singleton
@Component(modules={AppModule.class,
PointOfInterestModule.class,
LocationModule.class,
GyroModule.class})
public interface IAppComponent {
void inject(AllTheLocateApplication application);
void inject(MainActivity mainActivity);
void inject(AugmentedActivity augmentedActivity);
void inject(AppModule appModule);
void inject(PointOfInterestModule pointOfInterestModule);
void inject(LocationModule locationModule);
void inject(GyroModule gyroModule);
}
我的主要活动:
public class MainActivity extends LocationAwareActivity {
@Inject PointOfInterestModule pointOfInterestModule; // OK
@Inject LocationModule locationModule; // OK
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((AllTheLocateApplication) getApplication()).getAppComponent().inject(this);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, AugmentedActivity.class);
startActivity(intent);
}
}
我的“上帝”组件(也是应用程序中唯一的组件):
@Module
public class GyroModule implements SensorEventListener {
@Inject AppModule _appModule; // NULL
private SensorEvent _lastReading;
private SensorManager _sensorManager;
private Sensor _gyro;
@Inject
public GyroModule() {
initialize();
}
@Provides
@Singleton
public GyroModule provideGyroModule() {
return this;
}
@Singleton
@Component(modules={AppModule.class,
PointOfInterestModule.class,
LocationModule.class,
GyroModule.class})
public interface IAppComponent {
void inject(AllTheLocateApplication application);
void inject(MainActivity mainActivity);
void inject(AugmentedActivity augmentedActivity);
void inject(AppModule appModule);
void inject(PointOfInterestModule pointOfInterestModule);
void inject(LocationModule locationModule);
void inject(GyroModule gyroModule);
}
我的AppModule
@Module
public class AppModule {
AllTheLocateApplication mApplication;
public AppModule(AllTheLocateApplication application) {
mApplication = application;
}
public AllTheLocateApplication getApplication() {
return mApplication;
}
@Provides
@Singleton
AppModule providesAppModule() {
return this;
}
}
您是否应该为您拥有的每个模块制作一个组件[…]
没有
[…](然后在“超级组件”中组合组件)
没有
模块应该是您的计划B,并清楚地表达出来-除非真的有必要,否则应不惜一切代价避免使用。您需要使用模块的原因有三个:
- 无法使用构造函数注入创建依赖项
- 依赖项需要在创建时进一步初始化
- 依赖项正在实现接口,而您正在提供实现
initialize()
方法不应该是模块的一部分。如果必须提供A和A需要,则应如下所示:
@Provides
provideA(B b) {
A a = new A();
a.setB(b);
a.doMoreInitializationThatMustBeDoneNow();
return a;
}
B是否由同一模块、不同模块、父组件、组件依赖项或构造函数注入提供,与您无关。模块之间不需要相互了解,dagger只需使用B调用您的方法,然后您只需返回A
我不知道你想用你的代码样本做什么。模块不是业务逻辑的一部分。它们提供依赖关系。您不应该依赖业务逻辑中的模块。也不应该包含getter、setter或更新任何对象。模块创建一个对象并初始化它。他们不会以任何其他方式与之互动 通过创建一个java文件来使用dagger。添加一些模块。放入一个您试图注入一些依赖项的类。你可以看到事情是如何编译的(或者不编译)。也许可以尝试阅读更多关于dagger的教程,以便更好地理解核心概念 您是否应该为您拥有的每个模块制作一个组件[…] 没有 […](然后在“超级组件”中组合组件) 没有
模块应该是您的计划B,并清楚地表达出来-除非真的有必要,否则应不惜一切代价避免使用。您需要使用模块的原因有三个:
- 无法使用构造函数注入创建依赖项
- 依赖项需要在创建时进一步初始化
- 依赖项正在实现接口,而您正在提供实现
initialize()
方法不应该是模块的一部分。如果必须提供A和A需要,则应如下所示:
@Provides
provideA(B b) {
A a = new A();
a.setB(b);
a.doMoreInitializationThatMustBeDoneNow();
return a;
}
B是否由同一模块、不同模块、父组件、组件依赖项或构造函数注入提供,与您无关。模块之间不需要相互了解,dagger只需使用B调用您的方法,然后您只需返回A
我不知道你想用你的代码样本做什么。模块不是业务逻辑的一部分。它们提供依赖关系。您不应该依赖业务逻辑中的模块。也不应该包含getter、setter或更新任何对象。模块创建一个对象并初始化它。他们不会以任何其他方式与之互动 通过创建一个java文件来使用dagger。添加一些模块。放入一个您试图注入一些依赖项的类。你可以看到事情是如何编译的(或者不编译)。也许可以尝试阅读更多关于dagger的教程,以便更好地理解核心概念