问题标签 [assisted-inject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - @Assisted \ @Provider 在层次设计中对象创建中的使用
这个问题是关于正确使用 Guice @Assisted 和 @Provides 以及如何做到这一点。
我指的当前设计是这样的:层次结构顶部的类也是唯一暴露给客户端的类(基本上是公共 API),它看起来像这样:
正如您可能理解的那样, id 由用户在创建时提供(@Assisted?)但其他不是,它们只是工厂。
类Manager创建Shift类的实例。Shift类创建Worker类的实例。
现在,为了创建Shift类,我们使用它的构造函数:
由Manager提供的shiftId和其余的是来自Manager的构造函数的相同对象。
为了创建Worker,我们使用 2 个静态工厂方法(但可以更改..):
Shift类提供的workerId 。其余的由Shift构造函数委托。
什么是正确的 Guice-y 方法?我应该把@Assisted放在哪里?@提供?
我真的很想要一个代码示例,包括抽象模块,因为到目前为止我看到的代码示例对我来说还不能理解。
谢谢
java - Guice - 绑定由辅助注入工厂创建的实例
假设有一个类 A 的构造函数看起来像这样:
还有AFactory:
因此,要创建一个 AI 实例显然需要执行以下操作:
但是,假设我有其他类:B 类、C 类和 D 类具有类型 A 的成员,例如(具有字段注入但也可以是 ctor):
我希望将相同的 A 实例注入到这些类中。但是仍然可以选择将 A 的另一个实例注入其他类(比如说 E 类和 F 类)。
这样做的正确方法是什么?我只是想不出一个干净的方法来做到这一点。
java - 已在 TesterFactory.create() 中配置了与带有 @com.google.inject.assistedinject.Assisted(value=) 注释的 java.lang.String 的绑定
我的 TesterResource 类有 2 个成员:
但是,当我构建代码时,我收到一个错误 A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) is already configured at TesterFactory.create()。如果我只为 serviceName 保留 @Assisted,我不会收到此错误。
java - 使用多个构造函数的 Guice 辅助注入始终调用默认构造函数
我有一个有两个构造函数的类。我正在尝试使用 guice 工厂创建此类的实例。如果没有传递参数,则应调用默认构造函数。如果传递了参数,则应调用带参数的构造函数。但是目前即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本没有被调用。下面是我的工厂课。
下面是我试图注入的构造函数。
下面是我在抽象模块实现类中的模块绑定。
下面是我如何调用构造函数。
我在这里做错了什么?任何帮助将非常感激。
编辑:
请注意,JsonMapperImpl 类没有构造函数。它只有一个公共方法,仅此而已。
dependency-injection - 在 Guice 中使用 AssistedInject Factory 创建对象
我有一个应该以两种不同方式注入的类:
通用作为单例
自定义版本为 RequestScoped。
例子:
假设每个人都可以使用通用对象并竞争 performTask 操作(因为它是同步的),或者他们可以投资并创建自己的实例/实例。
出于一般目的,我创建了界面
和绑定:
对于定制版本,我创建了工厂
并安装它:
我已经尝试过了,它在运行时工作(我希望我没有在手动编写上面的代码时出错),但是我不确定它是否完全按照我的意愿工作,因为我只是写了它并且没有时间对其进行全面测试。
但后来我意识到我不知道工厂是如何运作的。对于不同的用户('userId'),它应该创建不同的实例,但是相同的 userId 呢?假设某个 John Doe 想要创建 3 个 TaskProcessorService 实例,工厂是否会为每个调用创建 3 个不同的实例(假设参数相同 - john doe 的 ID)?
这是主要问题,即使对于具有相同参数的调用,工厂是否总是创建新对象?在文档中找不到任何关于它的证据,而且我不能 100% 确定是否没有创建某些缓存机制。
第二个问题,它是问题的最佳解决方案吗?
java - 注释辅助注塑厂
没有AssistedInjection,我有以下
但是要使用 AssistedInjection,我需要
B
和的相应变化C
。
这有两个问题:
- 应用程序代码必须了解是调用
createB
还是createC
- 跨越我的
UberFactory
包结构以实例化IA
在我看来,更直观的 API 将是:
这样我就可以简单地注释IAFactory
我注入到我的应用程序代码中的实例。
但据我所知,没有这样的 API。所以,
- 有什么我遗漏的东西使这样的 API 不合理吗?
- 鉴于当前可用的功能,有没有办法近似这种行为?
java - Guice 辅助注射
我是 Guice 的新手,所以我想了解 AssistedInject。我有一个非常简单的项目:
我要注入的类:
辅助注射类:
工厂
主要课程:
但它仍然不起作用,我不明白,我错在哪里?
java - Guice 范围和 AssistedInject
我有使用 AssistedInject 来创建我的类的工厂的代码。现在我想做的是创建许多对象,每个对象都被注入集合的不同项目(可以说反向多重绑定)。
我的方法是使用包含迭代器的自定义范围来提供项目,但我做错了:
IterationScope.java:
IterationScoped.java:
在模块中:
我尝试获得这样的值:
并像这样设置范围:
我遇到的问题是,在创建工厂时,我在 IteratorScope.scope 中得到了 NullPointerException,因为没有设置 Iterator。
我的期望是,工厂仅在我实际请求对象时才尝试查找作用域提供程序,而不是在创建工厂时。有没有办法解决这个问题?我有一个丑陋的想法,涉及一个带有递增计数器的范围提供程序,以便选择集合的正确项目,但我想要一种更简洁的方法。
jakarta-ee - CDI - 如何注入非托管依赖项,如 Guice 的 Assisted Inject
Guice 有一个很好的扩展名为AssitedInject。有没有办法在 Java EE 中使用 CDI 实现自动装配工厂?我希望能够获得具有托管和非托管依赖项的托管实例。
想象一个类似命令模式的实现:
使用 Guice,我将能够创建一个提供实例的工厂:
我需要添加@Assited
到SomeCommand
s 构造函数参数model
并注册CommandFactory
到注入器:
SomeCommand
鉴于SomeModel
无法管理,我如何通过 CDI 获取实例。有没有类似的方法来创建像 Guice 这样的自动布线工厂?
java - guice 辅助注入 + 多重绑定 + 泛型
我正在尝试结合 Guice 的这 3 个特性:注入、多重绑定、泛型。我创建了一个生产项目的原型,所以这里是:
首先,这是泛型的一个小层次结构(在生产情况下,有 N 个实体的层次结构):
接下来,我想通过Factory创建的类ToCreate1和ToCreate2。
基类:
继承人:
然后,工厂本身:
所以,现在我想注入一张地图,其中包含Factory<Type1>和Factory<Type2>以分别创建ToInject1和ToInject2。
所以,我用 configure 方法创建了 Guice 的AbstractModule :
所以,我注入它@Inject public Map<String, Factory> map;
,一切都好:
正如我之前提到的,我的生产系统中有更多的类型,所以AbstractModule变得过于繁琐。我尽量避免重复代码和修改配置方法:
而且它不起作用!古斯 说:
怎么了?