假设我们定义了一个接口,同时拥有两个实现类,我们该如何将这两个实现类分别注入呢?Guice为我们提供了自定义绑定标注的方法处理此问题。我们可以使用@BindingAnnotation标注自定义两个标注,并分别作用于两个接口类型的成员变量,同时在绑定类中将接口根据这两个标注的作用对象分别绑定到具体实现类,然后将其注入。自定义标注如代码1所示。
- package sunyang.ManyClass;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import com.google.inject.BindingAnnotation;
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.FIELD, ElementType.PARAMETER})
- @BindingAnnotation
- public @interface Changchun {
- }
然后将这个标注的名字改成Jilin,就是我们定义的另一个标注,如代码2所示
- package sunyang.ManyClass;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import com.google.inject.BindingAnnotation;
- @Retention(RetentionPolicy.RUNTIME)
- @Target({ElementType.FIELD, ElementType.PARAMETER})
- @BindingAnnotation
- public @interface Jilin {
- }
然后定义两个实现接口Sunyang的类ChangchunSunyangImpl和JilinSunyangImpl,如代码3和4所示。
代码3 类ChangchunSunyangImpl.java
- package sunyang.ManyClass;
- import sunyang.Sunyang;
- public class ChangchunSunyangImpl implements Sunyang{
- public void print() {
- System.out.println("三扬长春");
- }
- }
- 代码4 类JilinSunyangImpl.java
- package sunyang.ManyClass;
- import sunyang.Sunyang;
- public class JilinSunyangImpl implements Sunyang{
- public void print() {
- System.out.println("三扬吉林");
- }
- }
把接口根据标注的作用对象分别绑定到具体实现类,如代码5所示。
代码5 类Bind.java
- package sunyang.ManyClass;
- import sunyang.Sunyang;
- import com.google.inject.Binder;
- import com.google.inject.Module;
- public class Bind implements Module {
- public void configure(Binder binder) {
- binder.bind(Sunyang.class).annotatedWith(Changchun.class).to(
- ChangchunSunyangImpl.class);
- binder.bind(Sunyang.class).annotatedWith(Jilin.class).to(
- JilinSunyangImpl.class);
- }
- }
在上面的代码中,annotatedWith方法用于判断标注作用的对象,从而将指定实现类绑定到接口中。如上所示annotatedWith方法遇到@Changchun作用的对象,从而将ChangchunSunyangImpl类绑定到接口Sunyang中。下面我们来看看执行注入和输出的类,如代码6所示。
代码6 类InjectBind.java
- package sunyang.ManyClass;
- import sunyang.Sunyang;
- import com.google.inject.Guice;
- import com.google.inject.Inject;
- public class InjectBind {
- @Inject
- @Changchun
- Sunyang changchunSunyang;
- @Inject
- @Jilin
- Sunyang jilinSunyangImpl;
- public static void main(String[] args){
- InjectBind ib=Guice.createInjector(new Bind()).
- getInstance(InjectBind.class);
- ib.changchunSunyang.print();
- ib.JilinSunyang.print();
- }
- }
在上面代码中将@Changchun、@Jilin标注分别作用于成员变量changchunSunyang、jilinSunyangImpl,同时使用标注@Inject对其进行声明,然后将Bind类注入,最后将这两个变量取出分别执行print方法。执行的结果如图所示。
图12-5 使用自定义标注处理单接口多实现类 |