注入无法控制实例化的类的最佳方法?
-
26-10-2019 - |
题
我是Guice的新手,所以希望这不是一个明显的问题...
我正在处理一个动态实例化我的应用程序课程之一的框架(让我们称呼它 C
)使用反射,因此我无法控制其实例化。此外,我没有简单的方法可以访问新创建的 C
框架进行了实例化之后。这是什么 C
看起来像:
public class C implements I { public C() { // this ctor is invoked by the framework so can't use DI here? } public void initialize() { // this is a post instantiation hook which the f/w will invoke } private void m() { Dependency d = Dependency.getInstance(); d.doSmth(); } }
我想 C
获取 Dependency
使用di。这里 Dependency
显然是单身人士,但总体上不一定是这样。
我提出了两种可能的解决方案,这两个解决方案都没有很整洁,所以我想我会问专家:
静态注射。我努力看到这如何在服务定位器的反pationn上大幅度改善 - 我最终得到了非最终静态场,这些静态领域可以在外部进行操纵...嗯。
该框架支持一个钩子
C
在实例化后初始化自己(initialize()
上面显示的方法)。此方法可以使用Setter注入自注射新创建的实例。
使用2,我想这意味着更大的外部可及时性,但至少在单位测试之类的情况下更明确地暴露了依赖性。麻烦是:在这种情况下,我该如何接触Guice喷油器(不依赖另一个服务定位器)?我还读过(并且倾向于同意),在应用程序代码中明确指向喷油器是可疑的实践。
您的见解将不胜感激。
非常感谢,
基督教
解决方案
您可以尝试将静态注射提供商注射到C.静态注入中以进行测试。但是,提供商使Guice可以既懒洋洋地又能急切地验证您的依赖项。
public class C implements I {
@Inject static Provider<Dep1> dep1Provider;
@Inject static Provider<Dep2> dep2Provider;
...
public void initialize() {
Dep1 dep1 = dep1Provider.get();
Dep2 dep2 = dep2Provider.get();
...
}
}
其他提示
如果您通过静态变量和静态访问器方法提供GUICE喷油器,则可以这样解决:
public class C implements I {
public C() {
// this ctor is invoked by the framework, you can't do injection here.
}
public void initialize() {
MyGuice.getInjector().inject(this);
}
@Inject
protected void init(Dep1 dep1, Dep2 dep2) {
this.dep1 = dep1;
this.dep2 = dep2;
}
private void m() {
dept1.doSmth();
}
}
静态调用有点像一个反图案,您可以用简单的注释删除该依赖性,如果您愿意使用执行代码编织或邮政编译步骤的解决方案,则可以照顾后构造器注入。这样,即使所有对象都没有初始化方法,您也可以注入所有对象。您可以在此处找到一个示例: 如何将模型对象注入extackj.
@Configurable
public class C implements I {
public C() {
// this ctor is invoked by the framework, you can't do injection here.
}
@Inject
protected void init(Dep1 dep1, Dep2 dep2) {
this.dep1 = dep1;
this.dep2 = dep2;
}
private void m() {
dept1.doSmth();
}
}