当前位置: 首页 > 知识库问答 >
问题:

Guice:注入需要绑定还是接口?我们需要获取注射器的实例吗?

田谦
2023-03-14

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

我正在阅读关于Guice注入的指南:https://www.tutorialspoint.com/guice/guice_first_application.htm,这看起来和我们公司的做法不一样。

  1. 第一步说创建接口。我们确实在模块类中有一个扩展AbstractMoules的绑定。

例:bind(SampleManager.class)。到(SampleManagerImpl.class)。在(Singleton.class)

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

指南中的第5步和第6步说,创建一个注入器并获得它的一个实例。我们在应用程序中根本不这么做。它是怎么工作的?

我们有很多被注入的类的实例,它们根本没有被绑定,而是用单例进行注释。例如,我们有TestManager,它附带了Guice注释@Singleton。然后我们把它注入到其他类中。

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

  • 绑定是必要的吗
  • 使用注入和单例有什么区别吗
  • 接口SampleManager只有一个方法,不能由任何其他类实现。为什么还要使用界面?对我来说,拥有一个由一个类实现的接口毫无意义。它似乎臃肿而令人困惑
  • 我们为什么不做第5步和第6步呢?为什么我们不需要一个注射器的实例

共有1个答案

班玉堂
2023-03-14

绑定是必要的吗?

是绑定注册Guice将尝试注入的对象。没有他们,Guice不知道你想要什么。Guice有点像Map,其中类是键(或者可选的键类),实例化的对象是值。

对于未看到绑定了bind()的对象,可以通过一个带有@提供注释的方法来提供它们,该方法与bind()非常相似,但允许您在实例化期间运行一些代码。

使用注入和单例有什么区别吗?

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

@Singleton是Guice在注入过程中如何实例化对象的修饰符。如果没有@Singleton,Guice每次注入一个新对象时都会创建一个新对象。如果有@Singleton,Guice会创建一次对象,然后每次请求绑定时都会注入相同的实例。您可以在这里阅读关于Guice作用域的内容

接口SampleManager只有一个方法,没有被任何其他类实现。为什么还要使用接口呢?对我来说,拥有一个由一个类实现的接口是没有意义的。这似乎很臃肿,也很混乱。

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

为什么我们不需要执行第5步和第6步?为什么我们不需要得到注射器的实例?

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

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

Guice会为你注射。

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

 类似资料:
  • 我有一个类(WindowedCounter)是使用辅助注射创建的。我需要为这个类注入一个工厂到一个方法拦截器中。现在一个方法拦截器只能绑定到一个具体的实例。所以我的问题是如何干净利落地做到这一点。

  • 我想创建一个动态绑定实例到命名注释的模块。用例是我想自动绑定配置中的值,属性文件中的键是@命名值。 然而,配置绑定在不同的模块中,所以我需要注入配置。我看过的解决方案是: > 绑定在confiure()方法中。这个方法没有注入,我不能得到基本配置。 使用提供程序/@提供程序。提供程序只绑定一个实例。 使用多活页夹。我的用例与这个扩展提供的有点不同。多重绑定允许您单独绑定多个实例,然后将它们作为包含

  • 问题内容: 我目前使用nodejs创建一些实验项目。我已经用Spring编写了很多Java EE Web应用程序,并赞赏那里的依赖注入的简易性。 现在我很好奇:如何使用节点进行依赖注入?或者:我什至需要吗?是否存在替代概念,因为编程风格不同? 到目前为止,我在谈论简单的事情,例如共享数据库连接对象,但是我还没有找到一个令我满意的解决方案。 问题答案: 简而言之,您不需要像C#/ Java中那样的依

  • 我有一个用例,我使用的是基于Spring的外部jar,而我的代码是基于Googleguice的。 我正在尝试通过编写模块在我的依赖项jar的此类中注入依赖项。 外部类: 我可以在我的模块中使用@provides方法中的setter设置成员,但@inject成员为空,我得到了countEvent和durationEvent的NullPointerException。 我的代码使用下面的provide

  • 当我们不需要整个序列时,而是只想取开头或结尾的几个元素,我们可以用take()或takeLast()。 Take 如果我们只想要一个可观测序列中的前三个元素那将会怎么样,发射它们,然后让Observable完成吗?take()函数用整数N来作为一个参数,从原始的序列中发射前N个元素,然后完成: private void loadList(List<AppInfo> apps) { mRec

  • 主要内容:Google Guice 按需注入 示例,输出注入是将依赖注入对象的过程。方法和字段注入可用于使用injector.injectMembers()方法使用退出对象进行初始化。请参阅下面的示例。 Google Guice 按需注入 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。