在下面的代码(使用吉斯和依赖注入):使用依赖注入优于新的优点是什么?
public class Main {
public static class Foo {
private FooInterface anInterface;
@Inject
Foo(FooInterface anInterface) {
this.anInterface = anInterface;
}
public void talk() {
anInterface.talk();
}
}
interface FooInterface {
void talk();
}
static class English implements FooInterface {
@Override
public void talk() {
System.out.println("Hello");
}
}
static class Spanish implements FooInterface {
@Override
public void talk() {
System.out.println("Hola");
}
}
public static class Module extends AbstractModule {
@Override
protected void configure() {
bind(FooInterface.class).to(English.class);
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new Module());
Foo injectorInstanceFoo = injector.getInstance(Foo.class);
injectorInstanceFoo.talk();
Foo regularInstanceFoo = new Foo(new Spanish());
regularInstanceFoo.talk();
}
}
什么是使用Guice(injectorInstanceFoo)
在“直接”的方式(regularInstanceFoo)
获得的Foo
实例的优势在哪里?
好处是您不必自己创建'Foo',这需要您将'FooInterface'实例放到需要构建它的地方。你的'Foo'的消费者可能被深埋在你的程序中。如果您手动执行DI,则必须通过层和代码层传递它。 –
但是,如果我只是在每个实例上使用** new **作为FooInterface,那么没有优势? –
@BobSacamano通常你注入的类也有依赖关系,所以你不能只使用'new'。此外,如果您使用注入,您可以使用“接缝”来测试或注入不同的实现 – NamshubWriter