Guice注入的总体思路是:1-首先有Interface 2-针对接口定义一个实现Imp 3-创建一个类(继承自PrivateModule或者AbstractModule )来定义Interface与实现类Imp的关系。通过下面的例子来理解这种定义。
定义一个Isay接口:
public interface ISay { String hello();}
定义ISay接口的实现ChsSayImp,可以定义多个实现
<span style="font-size:18px;">public class ChsSayImp implements ISay {
@Override
public String hello() { return "哈喽";}
}</span>
ISay接口的另外一个实现EngSayImp
public class EngSayImp implements ISay {
@Override
public String hello() { return "Hello";}
}
定义ISay接口与实现的绑定关系
public class SayModule extends AbstractModule {
@Override
protected void configure() {
bind(ISay.class).to(ChsSayImp.class);
}
}
然后再定义一个接口Iperson
public interface IPerson {
String say();
String wirte();
}
定义IPerson的实现类
public class Person implements IPerson {
@Inject
private ISay sayImp;//在Iperson的实现类中注入Say的实现
@Override
public String say() {
return sayImp.hello();
}
@Override
public String wirte() {
return "the write mehod";
}
}
然后定义Person绑定关系,这里使用PrivateModule来说明其中用法
public class PersonModule extends PrivateModule {
@Override
protected void configure() {
bind(IPerson.class).to(Person.class);
expose(IPerson.class);
install(new SayModule());
}
}
expose 方法将会使
bind(IPerson.class).to(Person.class); <span style="font-size:18px;">这个私有绑定关系对IPerson接口可见</span>
否则使用injector 无法获取IPerson的实例,一般expose前都会有一个bind方法,expose使这种绑定对module可见
install 就比较容易理解,因为Iperson的实现类中依赖 SayModule ,这里使用install 就是在当前module中添加SayModule依赖 有点类似于 import 引入头文件