原文地址:https://code.google.com/p/google-guice/wiki/UntargettedBindings
UntargettedBindings(没有目标的绑定):就是在module里绑定时不需要明确实现类,结合用@ImplementedBy或者@ProvidedBy实现。区别绑定的注解时要加上实现类的类型,即使是父类型。
贴代码:
import com.google.inject.ImplementedBy; @ImplementedBy(value = Cat.class) public interface Animal { void say(); } import com.google.inject.AbstractModule; import com.google.inject.Singleton; import com.google.inject.name.Names; public class AnimalModule extends AbstractModule { @Override protected void configure() { bind(Animal.class) .annotatedWith(Names.named("Tom")) .to(Animal.class) .in(Singleton.class); System.out.println("run AnimalModule.configure()"); } } public class Cat implements Animal { @Override public void say() { System.out.println("i am a cat"); } } import javax.inject.Named; import com.google.inject.Inject; public class CatWrapper { Animal animal; @Inject private CatWrapper(@Named("Tom") Animal animal) { System.out.println("CatWrapper.Contructor()"); this.animal = animal; } public void say() { animal.say(); } public Animal getAnimal() { return this.animal; } } import com.google.inject.Guice; import com.google.inject.Injector; public class Test { public static void main(String[] args) { Injector injector = Guice.createInjector(new AnimalModule()); CatWrapper wrapper1 = injector.getInstance(CatWrapper.class); System.out.println(wrapper1); System.out.println(wrapper1.getAnimal()); CatWrapper wrapper2 = injector.getInstance(CatWrapper.class); System.out.println(wrapper2); System.out.println(wrapper2.getAnimal()); } }
执行结果:
run AnimalModule.configure()
CatWrapper.Contructor()
com.zoo.guice.userguide.chap6.p1.CatWrapper@8fce95
com.zoo.guice.userguide.chap6.p1.Cat@143c8b3
CatWrapper.Contructor()
com.zoo.guice.userguide.chap6.p1.CatWrapper@12d7a10
com.zoo.guice.userguide.chap6.p1.Cat@143c8b3
上面这种是@ImplementedBy加上注解绑定的,后面也跟上了to,下面这种是@ProvidedBy实现。
import com.google.inject.ProvidedBy; @ProvidedBy(value = AnimalProvider.class) public interface Animal { void say(); } import com.google.inject.AbstractModule; import com.google.inject.Singleton; public class AnimalModule2 extends AbstractModule { @Override protected void configure() { bind(Animal.class).in(Singleton.class); System.out.println("run AnimalModule.configure()"); } } import com.google.inject.Provider; public class AnimalProvider implements Provider<Animal>{ public Animal get() { System.out.println("run Provider.get()"); return new Cat(); } } public class Cat implements Animal { @Override public void say() { System.out.println("i am a cat"); } } import com.google.inject.Guice; import com.google.inject.Injector; public class Test2 { public static void main(String[] args) { Injector injector = Guice.createInjector(new AnimalModule2()); Animal cat_A = injector.getInstance(Animal.class); System.out.println(cat_A); Animal cat_B = injector.getInstance(Animal.class); System.out.println(cat_B); } }
执行结果:
run AnimalModule.configure()
run Provider.get()
com.zoo.guice.userguide.chap6.p2.Cat@18ee9d6
com.zoo.guice.userguide.chap6.p2.Cat@18ee9d6