我正在尝试编写一个框架,其中任意 bean 类从我的 API 中注入类,它们可以与这两个类交互,也可以基于定义的注释触发回调。这是一个示例 bean:
@Experiment
static class TestExperiment {
private final HITWorker worker;
private final ExperimentLog log;
private final ExperimentController controller;
@Inject
public TestExperiment(
HITWorker worker,
ExperimentLog expLog,
ExperimentController controller
) {
this.worker = worker;
this.expLog = expLog;
this.controller = controller;
}
@SomeCallback
void callMeBack() {
... do something
log.print("I did something");
}
}
我正在尝试使用 Guice 注入这些 bean 并处理注入的类之间的相互依赖关系。但是,我有两个问题:
- 我传入的一个类 (
HITWorker
) 已经实例化了。我无法看到如何将其移至 aProvider
而不会显着复杂化我的代码。它也是持久的,但不是 Guice 定义的会话或请求范围,所以我现在自己管理它。(也许如果其他问题得到解决,我可以尝试把它放在提供者中。) - 更重要的是,我需要引用其他注入的类,以便对它们做适当的事情。当 Guice 注入它们时,我无法访问它们,因为 bean 类是任意的。
对于我基本上需要做的事情,这里有一些非常糟糕的代码,我确信这违反了所有正确的依赖注入概念。请注意,这hitw
是我需要传入的唯一实例,但我也在创建其他依赖对象,因为我需要对它们的引用。有了这段代码,我基本上只将 Guice 用于它的反射代码,而不是它的依赖解析。
private void initExperiment(final HITWorkerImpl hitw, final String expId) {
final ExperimentLogImpl log = new ExperimentLogImpl();
final ExperimentControllerImpl cont = new ExperimentControllerImpl(log, expManager);
// Create an experiment instance with specific binding to this HITWorker
Injector child = injector.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
bind(HITWorker.class).toInstance(hitw);
bind(ExperimentLog.class).toInstance(log);
bind(ExperimentController.class).toInstance(cont);
}
});
Object experimentBean = child.getInstance(expClass);
expManager.processExperiment(expId, experimentBean);
// Initialize controller, which also initializes the log
cont.initialize(expId);
expManager.triggerStart(expId);
tracker.newExperimentStarted(expId, hitw, cont.getStartTime());
}
我搞砸了,只需要编写自己的注入代码,还是有办法正确地做到这一点?另外,我是否应该忘记这些 bean 类的构造函数注入,因为我不知道它们到底包含什么?如果我要求 Guice 注入 bean 而不是自己做,有什么方法可以获取依赖关系?
对于上下文,我已经阅读了 Guice 文档并查看了几天的示例,但无济于事。我不认为我是一个完整的编程白痴,但我不知道如何正确地做到这一点!