最简单的方法来创build单身w / Dagger 2?

我是否需要设置模块,提供者和接口(组件)? 似乎只是为了能够注入一个单身的开销。

有人可以提供一个简单的单例使用Dagger 2吗? (也展示了如何像上下文一样设置单例的属性,所以你不需要每次使用单例都要传递它)

Related of "最简单的方法来创build单身w / Dagger 2?"

你只需要模块的东西,你不能用@Inject构造函数注释(因为例如,框架为你创build – 如上下文)。 如果不能添加@Inject构造函数,那么还需要在组件中指定void inject(...)方法。

但是,如果您可以使用@Inject构造函数创build它,那么@Inject可以作为字段注释工作

 @Component(modules={ContextModule.class}) @Singleton public interface SingletonComponent { void inject(MainActivity mainActivity); } @Module public class ContextModule { Context context; public ContextModule(Context context) { this.context = context; } @Provides Context context() { return context; } } @Singleton public class MyOtherSingleton { @Inject public MyOtherSingleton() { } } @Singleton public class MySingleton { @Inject Context context; @Inject MyOtherSingleton myOtherSingleton; @Inject public MySingleton() { } } 

你也可以做构造函数参数

 Context context; MyOtherSingleton myOtherSingleton; @Inject public MySingleton(Context context, MyOtherSingleton myOtherSingleton) { this.context = context; this.myOtherSingleton = myOtherSingleton; } 

 @Inject MySingleton mySingleton; //... SingletonComponent singletonComponent = DaggerSingletonComponent.builder() .contextModule(new ContextModule(this.getApplicationContext())) .build(); singletonComponent.inject(this); 

validation工作:

 08-23 04:39:28.418 com.zhuinden.rxrealm D/DogView: My singleton has [com.zhuinden.rxrealm.application.CustomApplication@53348a58] and [com.zhuinden.rxrealm.application.injection.test.MyOtherSingleton@5336bb74] 08-23 04:39:36.422 com.zhuinden.rxrealm D/CatView: My singleton has [com.zhuinden.rxrealm.application.CustomApplication@53348a58] and [com.zhuinden.rxrealm.application.injection.test.MyOtherSingleton@5336bb74] 

这是一个简单的(不完全精确的 – 检查下面的链接)文本逐渐解释Dagger2和它背后的想法。 我的期望是,你将能够阅读并理解Dagger2的其他细节。

不要把重点放在单身人士这个词上。 Dagger2(忘记匕首和使用dagger2)存在强制对象范围。 不是我们通常谈论的范围(类,方法,循环),而是架构级别的范围(您定义了这些层)。

Android中的一些典型图层是应用程序,活动和片段。 如你所知,你的android应用程序只获取Application类的一个实例。 Activity类的很多实例和Fragment类的很多实例。

你想保持你的应用程序的干净,你想保持你的对象所属的地方(强制执行语义)。 这些对象需要在某个地方创build(通常你必须input工厂类/方法/项目 – 最后一个是笑话) ,创build工具需要在某个地方调用,并且需要将这些对象从某个地方传递到它们所属的地方!

通常要input很多字符(通常是具有奇怪名称的类) ,并将这些对象从创build的位置传递到所属的位置可能是一个相当大的挑战。 特别是当许多不同的类使用你的特殊对象时。

Dagger2来拯救! 基本上有两个术语,你需要了解。 组件和模块。

组件在这里注入。 他们注入你的类与他们需要构build的对象。 组件只注入,不创build对象。 那么谁创造物体?

模块创build组件注入需要构造的类的对象。 模块充满了提供的InsertName方法。 这些方法创build需要传递给需要它们的类的对象。 提供方法将始终创build一个新的对象,或者如果该提供方法用@Scope注释(您需要键入一个新的范围注释,但这是细节) ,它将重用(单例)已经创build的对象。 提供方法的名称并不重要。 重要的是这些方法的返回types(只记得稍后有用的信息)

当你键入你的组件时,你需要说哪个模块与该组件相关联,并且在组件实例化期间,你将不得不将相关的模块实例传递给该组件的构造器。 组件和模块一起组成一个平均注射机器。

实例化组件(Dagger2为您的组件生成构build器类) ,您觉得该组件应该注入。 例如,你在Application类中创build一个ApplicationComponent实例。 由ApplicationComponent注入的对象只创build一次,并且在ApplicationComponent实例存在时存在(注入期间,它们将被获取,而不是重新创build) 。 应用程序实例存在时ApplicationComponent实例存在(所以在Android环境中基本上总是/在应用程序生命周期中)

您可以使用Activity类重复相同的故事。 在Activity类中实例化ActivityComponent,当Activity存在时,该Component存在。 请注意,ActivityComponent注入的对象只有在ActivityComponent(Activity类实例)存在时才存在。 这就是Dagger2的美丽。 属于“活动”图层的对象的字面范围为“活动”图层。

注:组件可以相互依赖。 你的ActivityComponent可以依赖于你的ApplicationComponent,所以Activity层可以使用来自Application层的对象(但不是其他方式,这是不好的devise) 。 这样,组件形成一个依赖树,使得对象的获取和注入非常有效。

看完这个(祝贺先生),我build议查看一下这个链接 ,看看杰克·沃顿在Dagger2上的谈话 。