用Guice写Java - 编程入门网
试图拉扯一根没有尽头的线。这是好事情。它表明依赖注入正在帮助你改进代码的灵 活性和可测试性。
如果重构工作太复杂,你不想一次性地整理完所有代码,你可以暂时将一个 Injector 的引用存入某个类的一个静态的字段,或是使用静态注入。这时,请清楚地命名包含该字 段的类:比如 InjectorHack和 GodKillsAKittenEveryTimeYouUseMe。记住你将来可能不 得不为这些类提供伪测试类,你的单元测试则不得不手工安装一个注入器。记住,你将来 需要清理这些代码。 绑定依赖关系 Guice 是如何知道要注入什么东西的呢?对启动器来说,一个包含了类型和可选的标 注的 Key 唯一地指明了一个依赖关系。Guice 将 key和实现之间的映射标记为一个 Binding。一个实现可以包含一个单独的对象,一个需要由 Guice 注入的类,或一个定制 的 provider。 当注入依赖关系时,Guice 首先寻找显式绑定,即你通过绑定器 Binder指明的绑定。 Binder API 使用生成器(Builder)模式来创建一种领域相关的描述语言。根据约束适用 方法的上下文的不同,不同方法返回不同的对象。 例如,为了将接口 Service 绑定到一个具体的实现 ServiceImpl,调用: binder.bind(Service.class).to(ServiceImpl.class); 该绑定与下面的方法匹配:
注: 与某些其他的框架相反,Guice 并没有给 "setter" 方法任何特殊待遇。不管方 法有几个参数,只要该方法含有 @Inject标注,Guice就会实施注入,甚至对基类中实现 的方法也不例外。 用Guice写Java(6)时间:2011-04-02 王咏刚不要重复自己 对每个绑定不断地重复调用"binder" 似乎有些乏味。Guice 提供了一个支持 Module 的类,名为 AbstractModule,它隐含地赋予你访问 Binder 的方法的权力。例如,我们 可以用扩展 AbstractModule 类的方式改写上述绑定: bind(Service.class).to(ServiceImpl.class); 在本手册的余下部分中我们会一直使用这样的语法。 标注绑定 如果你需要指向同一类型的多个绑定,你可以用标注来区分这些绑定。例如,将接口 Service 和标注 @Blue 绑定到具体的实现类 BlueService 的代码如下: bind(Service.class) .annotatedWith(Blue.class) .to(BlueService.class); 这个绑定会匹配以下方法:
注意,标注 @Inject 出现在方法前,而绑定标注(如 @Blue)则出现在参数前。对构 造函数也是如此。使用字段注入时,两种标注都直接应用于字段,如以下代码: @Inject @Blue Service service; 创建绑定标注 刚才提到的标注 @Blue 是从哪里来的?你可以很容易地创建这种标注,但不幸的是, 你必须使用略显复杂的标准语法:
幸运的是,我们不需要理解这些代码,只要会用就可以了。对于好奇心强的朋友,下 面是这些程式化代码的含义: @Retention(RUNTIME) 使得你的标注在运行时可见。 @Target({FIELD, PARAMETER}) 是对用户使用的说明;它不允许 @Blue 被用于方法、 类型、局部变量和其他标注。 @BindingAnnotation 是 Guice 特定的信号,表示你希望该标注被用于绑定标注。当 用户将多于一个的绑定标注应用于同一个可注入元素时,Guice 会报错。 有属性的标注 如果你已经会写有属性的标注了,请跳到下一节。 你也可以绑定到标注实例,即,你可以有多个绑定指向同样的类型和标注类型,但每 个绑定拥有不同的标注属性值。如果 Guice 找不到拥有特定属 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |