gpt4 book ai didi

java - 注入(inject)类型监听器

转载 作者:行者123 更新时间:2023-11-30 03:23:57 25 4
gpt4 key购买 nike

我有这样的场景,我想注入(inject)一个带有依赖项的 TypeListener ,但它永远不会工作,因为 TypeListener 用于实际执行注入(inject)。

我怎样才能完成这件事?有没有一种guicey方式?

注释:

  • 我正在使用 Guice 4.0
  • MyManager 将在 Guice::createInjector 之后使用。
  • MyManager::registerTypeMyManager::use 都在 Guice::createInjector 返回之前被专门调用。
  • MyDependency 的存在表明 MyManager 无法使用 new 实例化。我也会在 Guice::createInjector 返回后使用。

我创建了以下SSCCE展示我的问题:

import com.google.inject.*;
import com.google.inject.matcher.*;
import com.google.inject.spi.*;

public class MyClass {

public static void main(String[] args) {
Guice.createInjector(new MyModule());
}

static class MyModule extends AbstractModule {
@Override protected void configure() {
TypeListener listener = new MyTypeListener();
requestInjection(listener);
bindListener(Matchers.any(), listener);
}
}

static class MyTypeListener implements TypeListener {
@Inject MyManager manager;
@Override public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
Class<?> rawType = type.getRawType();
manager.registerType(rawType);
encounter.register(new InjectionListener<I>() {
@Override public void afterInjection(I injectee) {
manager.use(rawType, injectee);
}
});
}
}

@Singleton static class MyManager {
@Inject MyManager(MyDependency dependency) { }
void registerType(Class<?> type) { }
void use(Class<?> type, Object injectee) { }
}

static class MyDependency { }
}

最佳答案

我认为至少在某些时候(在测试或代码分析中)类型监听器与它们正在监听的类型没有内聚力,因此没有理由使用一个注入(inject)器。您可以使用一个注入(inject)器来创建监听器,并使用一个注入(inject)器来创建要测试/分析的代码。

如果您确实想要一个注入(inject)器(例如,如果您希望监听的注入(inject)器中的类型和监听器所需的类型是内聚的),那么您最好的选择是 AbstractModule 的 getProvider() 方法。因此,如果 MyTypeListener 需要 Foo 的实例,那么 MyModule 将如下所示:

   static class MyModule extends AbstractModule {
@Override protected void configure() {
TypeListener listener = new MyTypeListener(getProvider(Foo.class));
bindListener(Matchers.any(), listener);
}
}

如果您尚未使用 getProvider(),请预先警告,在构造注入(inject)器之前,您无法在提供程序上调用 .get()。只要您不从监听器构造函数的上下文中调用它,就应该没问题。

关于java - 注入(inject)类型监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709163/

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