前面几节主要介绍了绑定和注入方式,但是我们看到无论是通过在Module中通过Binder来绑定还是通过@ImplementedBy注解来绑定,一个接口都只能绑定到一个具体的实现类上,现在如果在一个调用类中,有多个Hello.java这个接口的属性,需要绑定到不同的实现类上,这如何使用Guice框架来完成注入呢?
这一节我们来说说接口多个实现类的注入方式
(1)首先定义一个接口Hello.java和两个不同的实现类HelloImpl1.java,helloImpl.java
package guice.di.mutiple;
public interface Hello {
//定义一个sayHello方法
void satHello() ;
}
package guice.di.mutiple;
//Hello 的实现类HelloImpl1
public class HelloImpl1 implements Hello{
public void satHello() {
System.out.println("HelloImpl1 say Hello!");
};
}
package guice.di.mutiple;
//Hello的具体实现类HelloImpl2
public class HelloImpl2 implements Hello{
@Override
public void satHello() {
System.out.println("HelloImpl2 say Hello!");
}
}
(2)创建一个Hello这个接口的调用者
package guice.di.mutiple;
import com.google.inject.Inject;
import com.google.inject.name.Named;
//将一个接口绑定到多个实现类上
public class HelloCaller {
@Inject
@Named("HelloImpl1")
private Hello helloImpl1 ;
@Inject
@Named("HelloImpl2")
private Hello helloImpl2 ;
public void sayHello1(){
helloImpl1.satHello() ;
}
public void sayHello2(){
helloImpl2.satHello() ;
}
}
(3)创建MyModule来实现一个接口绑定多个实现类
package guice.di.mutiple;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.name.Names;
public class MyModule implements Module{
@Override
public void configure(Binder binder) {
//通过annotatedWith 中使用Named方法来绑定多个实现类
binder.bind(Hello.class).annotatedWith(Names.named("HelloImpl1")).to(HelloImpl1.class) ;
binder.bind(Hello.class).annotatedWith(Names.named("HelloImpl2")).to(HelloImpl2.class) ;
}
}
(4)创建测试程序
package guice.di.mutiple;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Client {
public static void main(String[] args) {
Injector in = Guice.createInjector(new MyModule()) ;
HelloCaller caller = in.getInstance(HelloCaller.class) ;
caller.sayHello1() ;
caller.sayHello2() ;
}
}
输出结果:
HelloImpl1 say Hello!
HelloImpl2 say Hello!
本文介绍通过使用@Named注解来完成一个接口(父类)绑定多个实现类(子类)的方式。