我正在尝试编写一个框架,其中任意 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
) 已经实例化。我不知道如何将其移动到Provider
不会使我的代码显着复杂化。它也是持久的,但不适用于 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 文档并查看了几天有关此问题的示例,但无济于事。我不认为我是一个十足的编程白痴,但我不知道如何正确地做到这一点!