Android RoboGuice使用指南(5) Binding Annotations

有些情况需要将同一类型映射到不同的类实现,还是使用绘图的例 子.

IShape, Rectangle, MyRectangle, MySquare,有如下继承关系:

我们可能需要将IShape 同时映射到 MyRectangle 和MySquare ,这时可以使用Binding Annotation 来实现。 这时使 用类型和annotation (标注)可以唯一确定一个Binding。Type 和annotation 对 称为Key(键)。

为了同时使用MyRectangle和MySequare,我们定义两个 annotation,如下

import com.google.inject.BindingAnnotation;    

import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;     

...
@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Rectangle {
}
...     

@BindingAnnotation
@Target({ FIELD, PARAMETER, METHOD })
@Retention(RUNTIME)
public @interface Square {
}

定义了两个标注 @Rectangle, @Square, 至于@BindingAnnotation,@Target ,@Retention你并不需要详细了解,有兴趣的可以参见Java Annotation tutorial:

http://download.oracle.com/javase/tutorial/java/javaOO/annotations.h tml

简单的说明如下:

  • @BindingAnnotation 通知这是一个 Binding Annotation,如果将多个个标注应用到同一个元素时,Guice会报错。
  • @Target({FIELD, PARAMETER, METHOD}) 表示这个标注可以应 用到类成员变量,函数的参数或时方法。
  • @Retention(RUNTIME) 表示这个标注在程序运行时可以使用Reflection读取。

创建一 个BindingAnnotationsDemo 用来绘制两个图形:

public class 

BindingAnnotationsDemo extends Graphics2DActivity{     

 @Inject @Rectangle IShape  shape1;
 @Inject @Square IShape  shape2;     

 protected void drawImage(){     

 /**
 * The semi-opaque blue color in
 * the ARGB space (alpha is 0x78)
 */
 Color blueColor = new Color(0x780000ff,true);
 /**
 * The semi-opaque green color in the ARGB space (alpha is 0x78)
 */
 Color greenColor = new Color(0x7800ff00,true);     

 graphics2D.clear(Color.WHITE);
 graphics2D.Reset();     

 SolidBrush brush=new SolidBrush(blueColor);     

 graphics2D.fill(brush,shape1);
 AffineTransform at = new AffineTransform();
 at.translate(20, 20);
 graphics2D.setAffineTransform(at);
 brush=new SolidBrush(greenColor);
 graphics2D.fill(brush,shape2);     

 }     

}

使用标注将shape1 绑定到MyRectangle, shape2绑定到MySquare,对 应的Module 定义如下:

public class Graphics2DModule extends 

AbstractAndroidModule{     

 @Override
 protected void configure() {     

 bind(IShape.class)
 .annotatedWith(Rectangle.class)
 .to(MyRectangle.class);     

 bind(IShape.class)
 .annotatedWith(Square.class)
 .to(MySquare.class);     

 }
}

Inject 可以应用到Field (成员变量),Parameter (参 数)或Method(方法),前面的例子都是应用到Field上,如果应用到参数可以有 如下形式:

@Inject
public IShape getShape(@Rectangle IShape shape){
...
}

如果你不想自定义Annotation,可以使用Guice自带的@Name标注来解 决同一类型绑定到不同实现的问题。

修改上面代码:

[java] 

view plaincopyprint?

    //@Inject @Rectangle IShape  shape1;
    //@Inject @Square IShape  shape2;     

    @Inject @Named("Rectangle") IShape shape1;
    @Inject @Named("Square") IShape shape2;

修改绑定如下:

//bind(IShape.class)
//.annotatedWith(Rectangle.class)
//.to(MyRectangle.class);     

//bind(IShape.class)
//.annotatedWith(Square.class)
//.to(MySquare.class);     

bind(IShape.class)
 .annotatedWith(Names.named("Rectangle"))
 .to(MyRectangle.class);
bind(IShape.class)
 .annotatedWith(Names.named("Square"))
 .to(MySquare.class);

这种方法简单,但编译器无法检测字符串,比 如将”Square”错写为”Sqare”,编译器无法查出这个错误,此时到运行时才可 能发现 shape2 无法注入,因此建议尽量少用Named.

本例下载: http://www.imobilebbs.com/download/android/roboguice/BindingAnnotations Demo.zip

查看全套文章:http://www.bianceng.cn/OS/extra/201301/34950.htm

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索annotation
, class
, inject
, shape
, rectangle
android自定义shape
roboguice、roboguice3.0 使用、robobinding、robobinding android、guice,以便于您获取更多的相关知识。

时间: 2024-09-15 15:18:28

Android RoboGuice使用指南(5) Binding Annotations的相关文章

Android RoboGuice使用指南(10) Just-in-time Bindings

Injector 通过检查bindings 定义来创建某个类型的实例对象.定义在Module 中的绑定称为"明确声明绑定(Explicit bindings".Injector 会首先使用带 有Explicit Bindings为某个类型创建实例对象. 当但某个类型没有明确定义绑 定时,Injector 试图构造"即时绑定(Just-in-time Bindings),JIT Bindings 也成为隐含绑定(implicit bindings). Eligible Cons

Android RoboGuice使用指南(15) Inject Context

在Android应用程序中,很多地方需要引用到Context对象(Activity, Application,Service等).Roboguice 使得引用Context对象变得非常容易. 可以参见下面例子,这里定义一个不在Activity中的类ContextInfo,需 要引用Context对象: class ContextInfo{ final Context context; @Inject ContextInfo(Context context){ this.context=conte

Android RoboGuice使用指南(14) Inject View

在例子Android RoboGuice 使用指南(2):第一个例子Hello World 介绍了使用 Roboguice开发的基本步骤: 创建一个RoboApplication 的子类GuiceApplication,GuiceApplication为 Appliacation的子类,修改AndroidManifest.xml,将Application 的name 指向这 个类. 将原先由Activity派生的类基类改为RoboActivity(或其它相关 Activity). 如果有需要的话

Android RoboGuice使用指南(13) RoboGuice功能描述

前面在Android RoboGuice 使用指南(1):概述 对应Roboguice做了简要的介绍 ,之后介绍了Google Guice的基本用法,Roboguice是基本Android和Google Guice开发的适用于Android平台的Dependency Injection 开发包,下图为使用 Roboguice开发应用的基本框图: Android应用程序可以直接使用Google Guice来为普通类进行注入操作,而对 和Android平台相关的类如Activity,Context,

Android RoboGuice使用指南(6) Instance Bindings

我们在前面例子Android RoboGuice 使用指南(4):Linked Bindings 时为简单 起见,定义MyRectangle和MySquare时为它们定义了一个不带参数的构造函数,如 MyRectangle的如下: public class MyRectangle extends Rectangle{ public MyRectangle(){ super(50,50,100,120); } public MyRectangle(int width, int height){ s

Android RoboGuice使用指南(9) Untargetted Bindings

在创建Bindings时,也可以不给出绑定的目标,通常用于含有@ImplementedBy 和@ProvidedBy (后面介绍)的实类(Concrete classes 或type). Untargeted bindings 目的是通知Injector 某个类类型,从而Injector可以预先准备某个依 赖.Untargetted Bindings不含to语句. 例如: bind (MyConcreteClass.class); bind(AnotherConcreteClass.class)

Android RoboGuice使用指南(7)@ Provides Methods

上例说过如果需要构造一些较复杂的类的实例,通常的方法是使用@Provides 方法.这个方法必须定义在模块中(Module),而且必须使用@Provides 标注,在 个方法的返回类型则绑定到这个方法返回的对象实例. 如果这个方法带有 binding Annotation或是@Named("xxx"),Guice则将@Provides方法返回的对象 绑定到这个annotated 类型. 本例使用@Provides创建三个圆,然后再屏 幕上显示出来,图形库的使用可以参见Android简明

Android RoboGuice使用指南(19) 发送接收Events

Roboguice 提供了对Context 生命周期相关的事件的send 和receive ,系统缺 省支持的事件为: OnActivityResultEvent OnConfigurationChangedEvent OnContentC hangedEvent OnContentViewAvailableEvent OnCreateEvent OnDestroyEv ent OnNewIntentEvent OnPauseEvent OnRestartEvent OnResumeEvent<

Android RoboGuice使用指南(18) Inject Resources

Roboguice 对访问res 目录下各种资源drawable, arrary, string 等也提供 了注入支持.可以通过@InjectResource 很方便的应用所需资源. 本例修 改Android ApiDemos示例解析(48):Content->Resources->Resources 使 用Inject Resource方法来访问资源. public class InjectResourceDemo extends RoboActivity { @InjectView (R.