吉斯的宗旨
我(认为我)理解依赖注入的目的,但我只是不明白为什么我需要像Guice这样的东西来做到这一点(好吧,显然我不需要Guice,但我的意思是为什么使用它会是有益的)。假设我有现有的(非Guice)代码,如下所示:
public SomeBarFooerImplementation(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}
public void fooThatBar() {
foo.fooify(bar);
}
在更高层次的地方,也许在我的主要(),我有:
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的方式是如何有利的?
提前致谢。