具有不同范围的模块
Modules with different Scopes
如何创建一个带有注解(如@UserScope)的模块依赖于另一个 @Singleton 模块?
@Module(includes = {ApplicationModule.class})
public class JobManagerModule
{
private static final String TAG = JobManagerModule.class.getSimpleName();
@UserScope
@Provides
public JobManager providesJobManager(final Context context)
{
Log.d(TAG, "Providing JobManager");
final Configuration configuration = new Configuration.Builder(context).build();
return new JobManager(configuration);
}
}
在这里,JobManagerModule 提供使用@UserScope,但ApplicationModule 提供上下文对象(JobManagerModule 需要)作为@Singleton。
这显示错误。
如果要创建不同的 Scope
,则此作用域必须是 @Singleton
的子组件。
假设你有 ApplicationComponent
注释 @Singleton
:
@Singleton
@Component(
modules = ApplicationModule.class
)
public interface ApplicationComponent {
JobManagerComponent provide(JobManagerModule jobManagerModule);
}
ApplicationModule
提供 Context
:
@Module
public class ApplicationModule {
protected final Application mApplication;
public ApplicationModule(Application application) {
mApplication = application;
}
@Provides
@ApplicationContext
public Context provideApplicationContext() {
return mApplication;
}
}
注意,ApplicationComponent
必须提供 JobManagerComponent
Context
提供了 @ApplicationContext
注释。
现在您创建 JobManagerComponent
作为 ApplicationComponent
的 @Subcomponent
:
@UserScope
@Subcomponent(
modules = JobManagerModule.class
)
public interface JobManagerComponent{
}
JobManagerModule
:
@Module
public class JobManagerModule
{
private static final String TAG = JobManagerModule.class.getSimpleName();
@UserScope
@Provides
public JobManager providesJobManager(@ApplicationContext Context context)
{
Log.d(TAG, "Providing JobManager");
final Configuration configuration = new Configuration.Builder(context).build();
return new JobManager(configuration);
}
}
注意从 @Module
注释中删除了 include
并且 Context
用 @ApplicationContext
注释
创建JobManagerComponent
:
JobManagerComponent jobComponent = DaggerApplicationComponent.builder()
.applicationModule(applicationModule)
.build()
.provide(new JobManagerModule());
如何创建一个带有注解(如@UserScope)的模块依赖于另一个 @Singleton 模块?
@Module(includes = {ApplicationModule.class})
public class JobManagerModule
{
private static final String TAG = JobManagerModule.class.getSimpleName();
@UserScope
@Provides
public JobManager providesJobManager(final Context context)
{
Log.d(TAG, "Providing JobManager");
final Configuration configuration = new Configuration.Builder(context).build();
return new JobManager(configuration);
}
}
在这里,JobManagerModule 提供使用@UserScope,但ApplicationModule 提供上下文对象(JobManagerModule 需要)作为@Singleton。
这显示错误。
如果要创建不同的 Scope
,则此作用域必须是 @Singleton
的子组件。
假设你有 ApplicationComponent
注释 @Singleton
:
@Singleton
@Component(
modules = ApplicationModule.class
)
public interface ApplicationComponent {
JobManagerComponent provide(JobManagerModule jobManagerModule);
}
ApplicationModule
提供 Context
:
@Module
public class ApplicationModule {
protected final Application mApplication;
public ApplicationModule(Application application) {
mApplication = application;
}
@Provides
@ApplicationContext
public Context provideApplicationContext() {
return mApplication;
}
}
注意,ApplicationComponent
必须提供 JobManagerComponent
Context
提供了 @ApplicationContext
注释。
现在您创建 JobManagerComponent
作为 ApplicationComponent
的 @Subcomponent
:
@UserScope
@Subcomponent(
modules = JobManagerModule.class
)
public interface JobManagerComponent{
}
JobManagerModule
:
@Module
public class JobManagerModule
{
private static final String TAG = JobManagerModule.class.getSimpleName();
@UserScope
@Provides
public JobManager providesJobManager(@ApplicationContext Context context)
{
Log.d(TAG, "Providing JobManager");
final Configuration configuration = new Configuration.Builder(context).build();
return new JobManager(configuration);
}
}
注意从 @Module
注释中删除了 include
并且 Context
用 @ApplicationContext
创建JobManagerComponent
:
JobManagerComponent jobComponent = DaggerApplicationComponent.builder()
.applicationModule(applicationModule)
.build()
.provide(new JobManagerModule());