java - Dagger 2 延迟初始化映射条目
问题描述
我有一个 Dagger 模块和组件,定义如下。我只想在从地图中获取资源时才在模块中创建资源,而不是在服务启动时创建资源。我使用 Lazy 玩过,但不知道如何实现这一点。
@Module
public abstract class ExpensiveObjectModule {
@Singleton
@Provides
@IntoMap
@UniqueKey(Key.A)
static ExpensiveObject provideKeyAExpensiveObject() {
return new ExpensiveObject(Key.A);
}
@Singleton
@Provides
@IntoMap
@UniqueKey(Key.B)
static ExpensiveObject provideKeyBExpensiveObject() {
return new ExpensiveObject(Key.B);
}
}
@Singleton
@Component (modules = {
ExpensiveObjectModule.class
})
public interface HandlerComponent {
Map<Key, ExpensiveObject> getExpensiveObjectByKey();
}
handlerComponent.getExpensiveObjectByKey().get(key);
解决方案
每当您可以注入时,A
您也可以注入Provider<A>
,因此Map<K, A>
您可以拥有 a 而不是 a Map<K, Provider<A>>
。Lazy 可能也是如此,但 Provider 会尊重任何范围的东西,而 Lazy 总是会缓存它。
所以你可以像这样返回地图:
Map<Key, Provider<ExpensiveObject>> getExpensiveObjectByKey();
一个最小的示例(但在 Kotlin 中)如下所示:
@MustBeDocumented
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class Key(val value: String)
@Module
object ModFoo {
@Provides
@IntoMap
@Key("foo")
fun foo(): Any = "Foo"
@Provides
@IntoMap
@Key("bar")
fun bar(): Any = 3
}
@Component(modules = [ModFoo::class])
interface Foo {
val foo: Map<String, Any>
val fooProviders: Map<String, Provider<Any>>
}
推荐阅读
- javascript - Highcharts 可拖动点与极坐标图
- xamarin - 如何在不获取路径空异常的情况下获取 Microsoft.Extensions.PlatformAbstractions.PlatformServices.Default
- pandas - 熊猫选择列不同的帧
- android - 使用 cordova 播放用户选择的音频
- android - 如何使用 Retrofit/Gson 反序列化 JSON 中相同类型但具有不同字段名称的对象列表?
- menu - 断点后响应式导航栏出现问题
- java - 如何在不使用 CrudRepository 的情况下将 java spring boot 应用程序中定义的实体反映在数据库中
- html - 白色 icon.png 到蓝色 icon.png (html/css)
- java - 尚未被 GC 删除的对象
- java - Why is code coverage measured in test cases?