Dagger2中@Singleton对象实例化时机的技术问询
关于Dagger2中@Singleton对象的实例化时机问题
嘿,这个问题问得特别到位,正好戳中了Dagger2依赖注入的核心行为——默认懒加载!我来给你掰扯清楚:
首先明确结论:被@Singleton标注的对象,只有当你通过@Inject注入它,或者主动从Component中获取它的实例时,才会被实例化。如果没有任何地方触发注入/获取操作,Dagger绝对不会闲得没事去创建这个对象。
结合你给出的代码例子具体分析:
- 在
main类里,你声明了@Inject Test test;,并且调用了DaggerComponent.create().inject(this);——这时候Dagger会检测到你需要Test实例,就会创建Test的对象(因为它的构造方法也标注了@Inject),而且因为Test是@Singleton,这个实例会被ApplicationComponent缓存起来,后续任何地方再注入Test都会复用同一个对象。 - 而
main2类里,既没有用@Inject注入Test,也没有调用Component的方法去获取Test实例,所以Test对象完全不会在main2中被实例化,连影子都没有。
额外补充个小知识点:如果你想让@Singleton对象在Component创建的时候就立刻实例化(也就是饿汉式加载),可以在Component接口里加一个类似void initializeTest();的方法,然后在创建Component后主动调用这个方法,或者在@Provides方法里手动实例化并返回——不过这属于自定义操作,Dagger本身的默认行为还是懒加载哦。
内容的提问来源于stack exchange,提问作者Saba
相关产品推荐
相关产品推荐

