java - Guice:注入是否需要绑定或接口?我们需要获取注入器的实例吗?
问题描述
我对绑定如何与 Guice 一起工作感到很困惑。我是一家公司的初级开发人员,我正在查看我们的代码库,试图了解我们如何在我们的应用程序中实现 Guice。
我正在阅读有关 Guice 注入的指南:https : //www.tutorialspoint.com/guice/guice_first_application.htm,它看起来就像我们在我公司的做法。
- 第一步说创建接口。我们在扩展的 Module 类中有一个绑定
AbstractModule
。
前任:
bind(SampleManager.class).to(SampleManagerImpl.class).in(Singleton.class)
我们确实在我们的代码库中使用@Inject
了这个类。SampleManager
指南中的第 5 步和第 6 步说创建一个注入器并获取它的一个实例。我们在我们的应用程序中根本不这样做。它是如何工作的?
我们有很多很多被注入的类实例,它们根本没有被绑定,而是用单例注释。例如,我们
TestManager
将 Guice 注释@Singleton
附加到它上面。然后我们将它注入到其他类中。
所以这给我留下了以下问题:
- 绑定甚至是必要的吗?
- 使用注入和单例之间甚至有区别吗?
- 该接口
SampleManager
只有一个方法,并且不会被任何其他类实现。为什么还要使用接口?拥有一个由一个类实现的接口对我来说毫无意义。它看起来臃肿和混乱。 - 为什么我们不需要执行第 5 步和第 6 步?为什么我们不需要获取注入器的实例?
解决方案
绑定甚至是必要的吗?
是的,绑定注册了 Guice 将尝试注入的对象。没有它们,Guice 不知道您要什么。Guice 有点像 Map,其中 Class 是 Key(或可选的Key类),实例化的对象是值。
对于您看不到与bind()
它们绑定的对象,可能会通过使用@Provides注释注释的方法提供,这非常类似于bind()
但允许您在实例化期间运行一些代码。
使用注入和单例之间甚至有区别吗?
@Inject
基本上告诉 Guice '在这里注入东西'。您希望 Guice 将参数注入的任何方法都需要它。它还可以标记在对象实例化时注入的类级别变量以进行注入。
@Singleton
是 Guice 在注入期间如何实例化对象的修饰符。如果没有@Singleton
Guice,它每次注入一个新对象时都会创建一个新对象。使用@Singleton
Guice 会创建一次对象,然后在每次请求绑定时注入相同的实例。您可以在此处阅读有关 Guice 范围的信息
SampleManager 接口只有一个方法,不会被任何其他类实现。为什么还要使用接口?拥有一个由一个类实现的接口对我来说毫无意义。它看起来臃肿和混乱。
在不了解代码库的情况下无法确定,但这是一种非常常见的模式。如果您想在将来将其替换为具有不同实现的新类,可能只会使重构变得更容易。
为什么我们不需要执行第 5 步和第 6 步?为什么我们不需要获取注入器的实例?
当您不能让 Guice 为您注入值时,注入器用于获取需要使用 Guice 创建的对象的实例。就像你想要一个实例一样,SampleManager
你可以有一个方法,比如:
@Inject
foo(SampleManager manager){...}
Guice 会为你注入这些。
获取注入器适用于由于某种原因这不起作用的情况,例如,如果您需要将注入的值与调用函数提供的值混合使用。一般不建议直接使用喷油器,在大多数情况下都有避免使用的模式。
推荐阅读
- javascript - 是否可以在两个散点高图之间同步缩放?
- c++ - 两个qt ui头文件命名空间问题
- c# - 我是否正确声明了这个数组?
- java - 在 Android 9 中使用 DownloadManager 下载失败
- vue.js - vue 功能组件中的“参考”指的是什么?
- python - Python 2.7:如何打印这个字符?
- r - 如何计算连续出现低于R中的阈值
- windows - Go exec.Cmd() 导致 Python 脚本不导入模块?
- c# - 将数组存储为逗号分隔,如何使用 LINQ 进行查询?
- mysql - 外键错误 - 错误 1005 (HY000) ... 无法创建表 ... `stored_on` (errno: 150)