加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入 – 在Dagger中使用没有@Provides的@Singleton

发布时间:2020-12-13 20:44:26 所属栏目:百科 来源:网络整理
导读:注入类Foo的模块的一个小例子: @Module(complete = false,injects = { Foo.class })class MyModule { }class Foo { @Inject Foo(Bar bar,Baz baz) { }} (假设Bar和Baz由不同的模块提供) 我现在希望Foo成为一个单身人士. 我可以添加@Provides方法并使用@Sing
注入类Foo的模块的一个小例子:
@Module(complete = false,injects = { Foo.class })
class MyModule { }

class Foo {
    @Inject
    Foo(Bar bar,Baz baz) { }
}

(假设Bar和Baz由不同的模块提供)

我现在希望Foo成为一个单身人士.

我可以添加@Provides方法并使用@Singleton注释它…

@Module(complete = false,injects = { Foo.class })
class MyModule {
    @Provides @Singleton Foo provideFoo(Bar bar,Baz baz) {
        return new Foo(bar,baz);
    }
}

…但是我必须自己编写构造函数调用,这会破坏使用注入框架的目的.有没有更短的方法来实现这一目标?

TL;博士

您可以将@Singleton添加到类Foo {},并且当通过隐式绑定实例化Foo时,它将被绑定为@Singleton.例如:

@Module(complete = false,injects = { Foo.class })
class MyModule { }

@Singleton
class Foo {
  @Inject
  Foo(Bar bar,Baz baz) { }
}

范围

这里需要注意的是,如果在根图中隐式绑定但未引用,则扩展图(.plus()生成的图)可能会无意中实例化它,因此您需要将其声明为入口点(注入) =)(你在你的例子中做过),或者它需要被入口点可达的东西所消耗.

如果您没有使用.plus()进行作用域/生命周期管理,那么最后一点并不重要.但@Singleton意味着每个图形一个,图形的隐式绑定只能按需实现.即将推出的允许使用自定义范围注释的功能将捕获这些错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读