Google Guice 接口多实现 注入

来源:互联网 发布:js小图传给大图 编辑:程序博客网 时间:2024/05/17 23:17

前面几节主要介绍了绑定和注入方式,但是我们看到无论是通过在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 的实现类HelloImpl1public class HelloImpl1 implements Hello{public void satHello() {System.out.println("HelloImpl1 say Hello!");};}package guice.di.mutiple;//Hello的具体实现类HelloImpl2public class HelloImpl2 implements Hello{@Overridepublic 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{@Overridepublic 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注解来完成一个接口(父类)绑定多个实现类(子类)的方式。

0 0
原创粉丝点击