入口:绑定
出口:@Inject
一般使用构造函数注入(成员变量注入不常用):
<1> 使用final来区分denpendency和状态(其他一般会改变的成员变量)
<2> 注入时不考虑如何实现或绑定
使用@Inject指明需要guice注入的类,并在某个继承AbstractModule类中的configure方法中使用bind来绑定
成员变量注入:
<1> 用于测试
<2> 使用injectMembers来注入测试用例

其他注入:
<1> 注入Provider
public interface Provider<T>{
T get();
}
使用场景:
a、懒加载(例如数据库连接),在使用到数据库连接的时候再去加载,没有必要放到构造函数中,初始化时就去加载;
b、get() 场景下有多个实例
那么如何注入Provider?
向Guice请求Provider,不论如何绑定,例如:
DatabaseConnection dbConn
Provider<DatabaseConnection> dbConnProvider
无需自己实现Provider,并且Guice会考虑对象生命周期;但是如果想要的Provider很复杂,也可以自己实现Provider
在MyService接口上添加@ProvidedBy(MyProvider.class),等价于binder.bind(MyService.class).toProvider(MyProvider.class);
或者是在moudule类中使用@Provides注解
注解@Provides:
当使用@Provides方法创建对象时,该方法必须定义在Module类中,并且它必须加以@Provides注解;
该方法的返回值类型就是被绑定的对象.当注入器需要该类型的实例时,它就会来调用该方法.
与@Provider的区别:
@Provides方法绑定方式是可以和注解绑定混合使用的。如果在@Provides方法上有绑定注解(@AnnotationOne),Guice以绑定注解优先。Guice在调用@Provides方法之前会先解析该方法的依赖
总结:使用Provider进行注入的时候,你定义了一个Provider<T> 的变量,并放在构造函数中初始化;当然也可以不放在构造函数中,可以使用@Providedby注解,放在实现类上
方式1:在构造函数中初始化
public class StringWritingApplet implements MyApplet {
private MyDestination myDestination;
private Provider<String> stringProvider;
@Inject
public StringWritingApplet(MyDestination myDestination,/*@Output*/ Provider<String> stringProvider) {
this.myDestination = myDestination;
this.stringProvider= stringProvider;
}
private void writeString() {
myDestination.write(stringProvider.get());
}
public void run() {
writeString();
}
}
另外在module中绑定:

或者使用@Provides

这里的绑定靠的是返回类型,因为定义的是Provider<String>,所以bind(String.class)
方式2:使用toProvider或者注解@ProvidedBy
这种方式也叫 Class-style Provider
//定义一个实现了Provider的实现类
public class MyProvider implements Provider<String> {
@Override
public String get() {
return "Hello MyProvider";
}
}
在module中:

@ProvidedBy(),一般是定义在接口类上T的,参数是实现了Provider<T>的类,这里因为是String类型的,不做示例。
网友评论