这一节介绍下选项注入,就是可以默认给要注入的属性绑定一个实现类,如果你在Module中没有显示的绑定其他对象的话,就会绑定你默认的实现类。
(1)首先创建一个接口Hello.java,然后创建两个实现类HelloImpl.java和HelloImpl2.java
public interface Hello{
void sayHello() ;
}
public class HelloImpl implements Hello{
public void sayHello(){
System.out.println("HelloImpl say Hello!") ;
}
}
public class HelloImpl2 implements Hello{
public void sayHello(){
System.out.println("HelloImpl2 say Hello!") ;
}
}
(2)创建一个测试类
package guice.di;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Module;
public class OptionalDi {
//如果Guice容器中没有给这个hello绑定对象的话,默认会绑定HelloImpl实例
@Inject(optional=true)
private Hello hello = new HelloImpl();
public static void main(String[] args) {
//创建一个Injector
Injector in = Guice.createInjector(new Module(){
@Override
public void configure(Binder binder) {
//如果这句不注释的话,就会调用HelloImpl2的sayHello()方法、
//输出 HelloImpl2 say hello!
binder.bind(Hello.class).to(HelloImpl2.class) ;
}
}) ;
OptionalDi odi = in.getInstance(OptionalDi.class) ;
odi.sayHe() ;
}
public void sayHe(){
hello.sayHello() ;
}
}
由于我没有注释掉Module里面的绑定关系,输出结果:
HelloImpl2 say hello!如果注释掉的话,默认会输出 HelloImpl类中定义的sayHello方法。