我试图了解DI在我们的代码库(Kotlin)中是如何使用的。我们正在使用googleguice进行依赖注入。
下面是一个示例类:
class ServiceClass @Inject construct(
private val depA: DepA,
private val depB: DepB
) { ........ }
在模块类中:
@Provides
fun provideDepA(): DepA {
//constructs DepA object and returns it
}
DepB类别:
class DepB { .... }
据我所知,对于用< code>@Inject注释的变量,Google Guice会使用模块类来解决这些依赖关系。所以< code>DepA对象的注入方式是有意义的。
但是DepB
呢?我们如何能够在不指定任何位置的情况下注入DepB?
未在模块中声明的Guice绑定称为实时绑定,默认情况下,Guice愿意调用不带参数的构造函数:
Guice可以通过使用类型的可注入构造函数为具体类型创建绑定。在下列情况下,Guice认为构造函数是可注入的:
javax.inject.Inject
)。
如果你不需要显式绑定,并且你有一个公共的 no-arg 构造函数,Guice 会调用它,就好像你用 @Inject
标记了它一样。这与 Dagger 形成对比,Dagger 只会调用@Inject
注释的构造函数:
如果您的类有< code > @ Inject -注释的字段,但没有< code > @ Inject -注释的构造函数,Dagger将在请求时注入这些字段,但不会创建新的实例。添加一个带有< code>@Inject注释的无参数构造函数,以表明Dagger也可以创建实例。
...
Dagger无法构造缺少@Inject
注释的类。
在Guice和Dagger中,您可以在@提供
方法中自己构造对象,在Guice中,您还可以使用模块显式绑定到带有参数的构造函数,而无需@Inject
构造函数。
我有很多Android ViewModel类,它们往往有很多依赖项(大多数是Room中的DAO,每个SQLite表一个)。有些依赖项超过10个。 这很好,但Inject构造函数充满了参数,并且只包含样板代码,用于从构造函数参数设置注入的成员。 我想切换到“常规”注入成员,使用注释单独标识,就像其他(哑)类一样。 这对于与Android相关的类(尽管ViewModel被宣传为非Android依赖,例
有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn
我有一个单例类定义为: 我有另一个类使用这个单例类,但这个类必须使用新操作符创建。因此,我不能使用构造函数注入或setter注入等。 我当然可以将此实例传递到MyClass的构造函数中,但从我的程序上下文来看,这不是一个很好的设计。 另一个解决方案是为MySingletonClass创建一个静态getInstance方法,这样我就可以从程序中的任何地方获取实例。但我想知道Guice是否支持类似的东
问题内容: 如果你看一下课堂上的代码,我有两个问题: 服务器启动时,如果我在此类的构造函数中放置一个断点,就像在构造函数中那样,它是由spring使用配置的bean 提供的。但是,构造函数上没有注释,那么,在这个世界中如何以正确的依赖关系调用该构造函数?应该是null。 这是Spring Boot的自动假设吗? Spring是否看到“私有字段+构造函数参数”,并且假定它应该寻找合适的bean? 是
我正在使用spring官方教程中的示例进行实验,并且对此代码有一个依赖关系: https://github.com/spring-guides/gs-async-method/tree/master/complete 如果您查看类上的代码,我有两个问题: 当服务器启动时,如果我在这个类的构造函数中放置一个断点,就像在构造函数中一样,是由spring使用配置的bean提供的。但是,构造函数上没有注释
问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解