我正在尝试将singleton
存储库注入Foo
类以使用它
repo
未被注入且仍然为空,为什么我缺少一些注释或者这不是正确的方法
Repository.java
@Singlton
public class Repository {...}
Foo.java
public class Foo {
@Inject Repository repo;
}
答案 0 :(得分:4)
Dagger通过组件工作:具体来说,您将Dagger传递给您想要或想要做的事情列表(组件接口)以及您希望如何提供非平凡的依赖项(模块) ),然后Dagger生成一个实现你想要的界面的实现。
您已经向我们展示了Foo及其相关信息库,但如果您还没有向我们展示组件,我猜测您可能没有。此时你可以选择如何继续:你可以从Dagger组件中获取你的Foo,或者你可以像往常一样创建你的Foo,然后调用inject(foo)
注入一个特定的Foo实例及其所有{ {1}}字段(包括您的存储库)。前者通常更倾向于制作简单的界面,但后者适用于您无法控制生命周期的对象(如Android的应用程序,活动,片段,服务和其他类似对象)。 / p>
如果你选择让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上添加一个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示例。