原文地址:https://code.google.com/p/google-guice/wiki/BindingAnnotations
BindingAnnotations(绑定注释):一个类型可能会有多个实现类,在绑定时加上注解,这样可以确定在依赖注入时用的具体是哪个实现类。
具体有2种,一种是自定义注解,另一种是@Named。
先看自定义注解,贴代码:
import com.google.inject.BindingAnnotation; import java.lang.annotation.Target; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; @BindingAnnotation @Target({FIELD, PARAMETER, METHOD }) @Retention(RUNTIME) public @interface Tom { } public interface Animal { void say(); } public class Cat implements Animal{ @Override public void say() { System.out.println("i am a cat"); } } public class Dog implements Animal{ @Override public void say() { System.out.println("i am a dog"); } } public interface HelloService { void sayHello(); } import com.google.inject.Inject; public class HelloServiceImpl implements HelloService { Animal animal; @Inject public HelloServiceImpl(@Tom Animal animal) { this.animal = animal; } @Override public void sayHello() { System.out.println(animal.getClass().getSimpleName()); animal.say(); } } import com.google.inject.AbstractModule; public class HelloServiceModule extends AbstractModule { @Override protected void configure() { bind(Animal.class).annotatedWith(Tom.class).to(Cat.class); bind(Animal.class).to(Dog.class); bind(HelloService.class).to(HelloServiceImpl.class); } } public class Test { public static void main(String[] args) { Injector injector = Guice.createInjector(new HelloServiceModule()); HelloService helloService = injector.getInstance(HelloService.class); helloService.sayHello(); } }
执行结果:
Cat
i am a cat
当把HelloServiceImpl的构造函数里的@Tom去掉后,执行结果:
Dog
i am a dog
发现,多个实现类绑定到一个类型时,后者覆盖前者。
第二种,用@Named注解,贴代码:
import com.google.inject.Inject; import com.google.inject.name.Named; public class HelloServiceImpl2 implements HelloService { Animal animal; @Inject public HelloServiceImpl2(@Named("Snoopy") Animal animal) { this.animal = animal; } @Override public void sayHello() { System.out.println(animal.getClass().getSimpleName()); animal.say(); } } import com.google.inject.AbstractModule; import com.google.inject.name.Names; public class HelloServiceModule2 extends AbstractModule { @Override protected void configure() { bind(Animal.class).annotatedWith(Names.named("Snoopy")).to(Dog.class); bind(Animal.class).to(Cat.class); bind(HelloService.class).to(HelloServiceImpl2.class); } } import com.google.inject.Guice; import com.google.inject.Injector; public class Test2 { public static void main(String[] args) { Injector injector = Guice.createInjector(new HelloServiceModule2()); HelloService helloService = injector.getInstance(HelloService.class); helloService.sayHello(); } }
执行结果:
Dog
i am a dog