google guice笔记(四)

guice(四)注入
获取类或者说获取客户代码的时候不一定立刻就需要注入相应的实现类 这时候就需要声明一个提供者Provider 在需要的时候用Provider.get()方法来获取就行了
@Inject
void injectAtm(Provider atm) {
Money one = atm.get();
Money two = atm.get();
...
}

注入常数值

对于常数值,Guice 对以下几种类型做了特殊处理:

* 基本类型(int, char, ...)
* 基本封装类型(Integer, Character, ...)
* Strings
* Enums
* Classes

首先,当绑定到这些类型的常数值的时候,你不需要指定你要绑定到的类型。Guice 可以根据值判断类型。例如,一个绑定标注名为 TheAnswer:

bindConstant().annotatedWith(TheAnswer.class).to(42);

它的效果等价于:

bind(int.class).annotatedWith(TheAnswer.class).toInstance(42);

当需要注入这些类型的数值时,如果 Guice 找不到指向基本数据类型的显式绑定,它会找一个指向相应的封装类型的绑定,反之亦然。
转换字符串
如果 Guice 仍然无法找到一个上述类型的显式绑定,它会去找一个拥有相同绑定标注的常量 String 绑定,并试图将字符串转换到相应的值。例如:

bindConstant().annotatedWith(TheAnswer.class).to("42"); // String!

会匹配:

@Inject @TheAnswer int answer;

转换时,Guice 会用名字去查找枚举和类。Guice 在启动时转换一次,这意味着它提前做了类型检查。这个特性特别有用,例如,当绑定值来自一个属性文件的时候。