从Dagger 2开始 - 不注射

时间:2018-01-07 20:21:53

标签: java dependency-injection singleton dagger

我正在尝试将singleton存储库注入Foo类以使用它 repo未被注入且仍然为空,为什么我缺少一些注释或者这不是正确的方法

Repository.java

@Singlton
public class Repository {...} 

Foo.java

public class Foo {
  @Inject Repository repo;
}

2 个答案:

答案 0 :(得分:4)

Dagger通过组件工作:具体来说,您将Dagger传递给您想要或想要做的事情列表(组件接口)以及您希望如何提供非平凡的依赖项(模块) ),然后Dagger生成一个实现你想要的界面的实现。

您已经向我们展示了Foo及其相关信息库,但如果您还没有向我们展示组件,我猜测您可能没有。此时你可以选择如何继续:你可以从Dagger组件中获取你的Foo,或者你可以像往常一样创建你的Foo,然后调用inject(foo)注入一个特定的Foo实例及其所有{ {1}}字段(包括您的存储库)。前者通常更倾向于制作简单的界面,但后者适用于您无法控制生命周期的对象(如Android的应用程序,活动,片段,服务和其他类似对象)。 / p>

获取Foo

如果你选择让Dagger创建你的Foo,你需要为Foo和Repository创建一个@Inject - 带注释的构造函数(甚至是空的),然后像这样编写一个

@Inject

出色!现在只要你有一个YourComponent的实现,你就可以创建一个Foo并注入它。您还没有编写实现,但如果您这样做,它可能看起来像这样:

@Component public interface YourComponent {
  Foo createFoo();  // Name this whatever you like; it's a factory because
                    // of its return type and lack of parameters.
}

但是,您不必写一个:Dagger会在您compile the YourComponent interface with the Dagger compiler后立即为您写一个等同于,这意味着要编译它使用public YourComponentImpl implements YourComponent { @Override public Foo createFoo() { Foo foo = new Foo(); foo.repo = new Repository(); return foo; } } 将Dagger编译器指定为源代码处理器。 Dagger作为注释处理器,读取javac接口并生成一个名为DaggerYourComponent的类。之后,您可以通过调用静态方法@Component来获取实例,然后在该实例上调用DaggerYourComponent.create(),否则请拨打yourComponent.createFoo()

注入现有的Foo

要注入,你遵循与上面类似的模式,除了你的方法应该采用一个参数(你现有的Foo实例),因此你不需要在Foo上添加一个new Foo() - 带注释的构造函数因为Dagger没有构建过一个。但是,您可以使用Repository,因为Dagger会创建它。

@Inject

这样您就可以像上面一样调用@Component public interface YourComponent { void inject(Foo foo); // Name this whatever you like; it's a members injector // because it takes exactly one argument. } 来创建您的组件,然后调用DaggerYourComponent.create()将注册表注入您注释的yourComponent.inject(foo)字段。

一旦你对Dagger越来越熟悉,你就可以开始建立你所知道的东西并添加模块,注入repo注入,或添加范围,这样你就可以重用实例而不是而不是每次都创造新的。查看User's Guide了解更多信息。

答案 1 :(得分:0)

您是否初始化了注射器并宣布您的单身人士?例如,通过创建一个使用@Module注释的类来发信号通知Dagger,以便在可用的方法中搜索可能的实例提供程序。请尝试关注this示例。