我(想我)理解依赖注入的目的,但我只是不明白为什么我需要像 Guice 这样的东西来做到这一点(好吧,显然我不需要Guice,但我的意思是为什么使用它会有好处)。假设我有类似这样的现有(非 Guice)代码:
public SomeBarFooerImplementation(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}
public void fooThatBar() {
foo.fooify(bar);
}
在更高级别的某个地方,也许在我的 main() 中,我有:
public static void main(String[] args) {
Foo foo = new SomeFooImplementation();
Bar bar = new SomeBarImplementation();
BarFooer barFooer = new SomeBarFooerImplementation(foo, bar);
barFooer.fooThatBar();
}
现在我基本上得到了依赖注入的好处,对吧?更容易的可测试性等等?当然,如果您愿意,也可以轻松更改 main() 以从配置中获取实现类名,而不是硬编码。
据我了解,要在 Guice 中做同样的事情,我会做类似的事情:
public SomeModule extends AbstractModule {
@Override
protected void configure() {
bind(Foo.class).to(SomeFooImplementation.class);
bind(Bar.class).to(SomeBarImplementation.class);
bind(BarFooer.class).to(SomeBarFooerImplementation.class);
}
}
@Inject
public SomeBarFooerImplementation(Foo foo, Bar, bar) {
this.foo = foo;
this.bar = bar;
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new SomeModule());
Foo foo = injector.getInstance(Foo.class);
barFooer.fooThatBar();
}
是这样吗?在我看来,它只是语法糖,而不是特别有用的语法糖。如果将“new XxxImplementation()”的东西分解成一个单独的模块而不是直接在 main() 中执行它有一些优势,那么无论如何不用 Guice 也很容易做到。
所以我觉得我错过了一些非常基本的东西。您能否向我解释一下 Guice 方式的优势?
提前致谢。