gpt4 book ai didi

java - Guice - 在运行时根据定义的注入(inject)点将泛型类绑定(bind)到实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:13 24 4
gpt4 key购买 nike

我有一个类Property<T>我想在我的应用程序启动后绑定(bind)。 Property<T>表示 T 类型的属性其值可以在运行时修改。

我有可以这样注入(inject)的类:

public class MyClass {
public MyClass(@Named("someName") Property<String> property) {
...
}
}

我可以绑定(bind)这些实例,但只有在我的应用程序启动后我才需要知道所有 Named这样做的注释值。


我已经开始查看 Elements并访问所有 Element实例找到它的所有 Binding秒。一旦我有了 Bindings , 我可以使用 InjectionPoint.forConstructor()获取构造函数。

困扰我的是各种类型的绑定(bind)都有其差异。我必须处理访问 LinkedKeyBinding , UntargettedBinding , ETC..有没有更简单的方法来获取所有InjectionPoint对于给定的模块列表?还是我做错了?

谢谢!

最佳答案

听起来您正在尝试注入(inject) @Named(foo) Property<bar>对于所有 foo 和 bar 并在事后解决它们,Guice 做得不是特别好。因为 Guice 配置发生在运行时(必须运行 configure 方法),所以您可以将 Guice 的 SPI 用于您正在做的事情的唯一方法是先发制人地绑定(bind)所有键,这样 Guice 就不会提示对象不完整图表然后检查它以找出要填充的内容。这似乎费力且设计过度。

此外,只要 Guice 允许 JIT 或“隐式”绑定(bind),在请求对象之前,您无法知道 Guice 可能尝试解析的每个键。这可能会让你很难绑定(bind)你需要的一切,即使你有一个完美的模块或注入(inject)器反射库。如果您在创建注入(inject)器之前不知道您需要什么或什么可用,您也会绕过一些 Guice 的依赖关系图验证功能。

虽然这不是 Guice 和依赖注入(inject)概念的完美使用,但我会通过编写 PropertyOracle 来调整我的代码:

public class MyClass {
private final Property<String> someNameProperty;

public MyClass(PropertyOracle propertyOracle) {
someNameProperty = propertyOracle.getString("someName");
// The act of getting tells the oracle which properties to get. You can also
// separate those steps without holding onto an instance:
propertyOracle.prepare("keyToBeRequestedLater");
}
}

虽然这种类型的规定在某种程度上重复了 Guice,但与 Guice 不同的是,您可以注入(inject)具有您想要的任何类型或键的属性,然后稍后解析它——可能是异步的。然后,您将编写一个伪造的或模拟的 PropertyOracle 以在测试中使用,这不像直接注入(inject) Property 实例那么容易,但它可能是 Hook 请求的最简单方法,没有 Guice SPI 的复杂性。

关于java - Guice - 在运行时根据定义的注入(inject)点将泛型类绑定(bind)到实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40711358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com