首页 > 解决方案 > Guice:注入是否需要绑定或接口?我们需要获取注入器的实例吗?

问题描述

我对绑定如何与 Guice 一起工作感到很困惑。我是一家公司的初级开发人员,我正在查看我们的代码库,试图了解我们如何在我们的应用程序中实现 Guice。

我正在阅读有关 Guice 注入的指南:https : //www.tutorialspoint.com/guice/guice_first_application.htm,它看起来就像我们在我公司的做法。

  1. 第一步说创建接口。我们在扩展的 Module 类中有一个绑定AbstractModule

前任: bind(SampleManager.class).to(SampleManagerImpl.class).in(Singleton.class)

我们确实在我们的代码库中使用@Inject了这个类。SampleManager

  1. 指南中的第 5 步和第 6 步说创建一个注入器并获取它的一个实例。我们在我们的应用程序中根本不这样做。它是如何工作的?

  2. 我们有很多很多被注入的类实例,它们根本没有被绑定,而是用单例注释。例如,我们TestManager将 Guice 注释@Singleton附加到它上面。然后我们将它注入到其他类中。

所以这给我留下了以下问题:

标签: javadependency-injectionguiceinject

解决方案


绑定甚至是必要的吗?

是的,绑定注册了 Guice 将尝试注入的对象。没有它们,Guice 不知道您要什么。Guice 有点像 Map,其中 Class 是 Key(或可选的Key类),实例化的对象是值。

对于您看不到与bind()它们绑定的对象,可能会通过使用@Provides注释注释的方法提供,这非常类似于bind()但允许您在实例化期间运行一些代码。

使用注入和单例之间甚至有区别吗?

@Inject基本上告诉 Guice '在这里注入东西'。您希望 Guice 将参数注入的任何方法都需要它。它还可以标记在对象实例化时注入的类级别变量以进行注入。

@Singleton是 Guice 在注入期间如何实例化对象的修饰符。如果没有@SingletonGuice,它每次注入一个新对象时都会创建一个新对象。使用@SingletonGuice 会创建一次对象,然后在每次请求绑定时注入相同的实例。您可以在此处阅读有关 Guice 范围的信息

SampleManager 接口只有一个方法,不会被任何其他类实现。为什么还要使用接口?拥有一个由一个类实现的接口对我来说毫无意义。它看起来臃肿和混乱。

在不了解代码库的情况下无法确定,但这是一种非常常见的模式。如果您想在将来将其替换为具有不同实现的新类,可能只会使重构变得更容易。

为什么我们不需要执行第 5 步和第 6 步?为什么我们不需要获取注入器的实例?

当您不能让 Guice 为您注入值时,注入器用于获取需要使用 Guice 创建的对象的实例。就像你想要一个实例一样,SampleManager你可以有一个方法,比如:

@Inject
foo(SampleManager manager){...}

Guice 会为你注入这些。

获取注入器适用于由于某种原因这不起作用的情况,例如,如果您需要将注入的值与调用函数提供的值混合使用。一般不建议直接使用喷油器,在大多数情况下都有避免使用的模式。


推荐阅读