原文地址: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
