如何创建一个可以从代码中的任何位置访问的单例对象?
getApplication()
快速举个例子:
注入类:
public class InjectedClass {
public InjectedClass() {
System.out.println("injected class created");
}
}
持有人A类:
public class HolderClassA { // this is one of object I marked with (1)
@Inject InjectedClass b;
public HolderClassA() {
Injector build = DaggerInjector.builder().build();
build.inject(this);
System.out.println(b);
}
}
持有人B类:
public class HolderClassB { // this is another object I marked with (1)
@Inject InjectedClass b;
public HolderClassB() {
Injector build = DaggerInjector.builder().build();
build.inject(this);
System.out.println(b);
}
}
提供者:
@Module
public class Provider {
@Provides
@Singleton
InjectedClass provideInjectedClass() {
return new InjectedClass();
}
}
注射器:
@Component(modules = {Provider.class})
@Singleton
public interface Injector {
void inject(HolderClassA a);
void inject(HolderClassB a);
}
代码中的某处:
new HolderClassA();
代码中的其他地方与以前的代码没有任何关系,也没有相同的父级或可以访问相同的对象(如在 dagger guide 中getApplication()
):
new HolderClassB();
实际结果:InjectedClass 的两个实例被打包
预期结果:创建了单个实例InjectedClass
。
问题是DaggerInjector.builder().build();
创建了彼此不了解的不同范围。例如,我可以通过创建静态变量DaggerInjector.builder().build()
并从中调用注入来解决这个问题。但因此它不再是依赖注入,而是不再是简单的单例模式。
根据我从评论中的理解,您需要为持有者类使用单独的组件,以便注入相同的实例?如果我错了,请原谅我。你可以试试这个。
@Component(modules = arrayOf(AppModule::class))
@Singleton
interface AppComponent {
//sub components
fun plusHolderClass1(holderModule: HolderModule1):HolderComponent1
fun plusHolderClass2(holderModule: HolderModule2):HolderComponent2
//provision methods
fun getInjectedClass():InjectedClass
}
这是您的应用程序组件或顶级组件,您在应用程序中初始化,当然使用您的 Module 类,它将提供 Injected 类作为单例。
@Subcomponent(modules = arrayOf(HolderModule1::class))
@ActivityScope
interface HolderComponent1{
fun inject(holder:Holder1)
}
和 Holder2 类的类似。您可以在模块中定义本地范围依赖项。
但是当然即使在这种情况下,您也必须将 appComponent 的实例存储在 Application 类中。
注射时
appComponent.plusHolderComponent1(HolderModule1()).inject(yourObject)
InjectedClass 对象将通过从配置方法中获取来注入到 yourObject
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句