Android注解 http://androidannotations.org/
使用编译时注释处理。它生成一个子类,在原始名称后附加下划线(MyActivity_
产生于MyActivity
)。因此,要使其工作,您始终必须使用生成的类作为引用,而不是原始类。
它有非常丰富的功能集,请参阅可用注释列表 https://github.com/excilys/androidannotations/wiki/AvailableAnnotations.
牛油刀 http://jakewharton.github.io/butterknife/
还使用编译时注释处理,但它生成由中心类使用的查找器类(ButterKnife
)。这意味着你可以使用你原来的类来引用,但你必须手动调用注入。摘自 ButterKnife 介绍的副本:
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
功能集不是那么丰富,ButterKnife 支持视图注入(AndroidAnnotations 相当于@ViewById
and @ViewsById
)和一些事件绑定(完整列表请参见命名空间目录here https://github.com/JakeWharton/butterknife/tree/master/butterknife/src/main/java/butterknife,只需计算OnXXX
事件注释)。
Dagger http://square.github.io/dagger/
是 Android 的 DI 实现,类似于 Guice。它还使用编译时注释处理并生成用于手动注入的对象图。您可以区分应用程序对象图和用于注入的作用域对象图,例如在活动中。在这里你看到一个Application.onCreate
例子:
@Override public void onCreate() {
super.onCreate();
objectGraph = ObjectGraph.create(getModules().toArray());
objectGraph.inject(this);
// use injected classes
}
我发现从匕首开始比较困难,但这可能只是我的经验。不过,请观看此处的一些视频以获得更好的开始:1 http://www.infoq.com/presentations/Dagger, 2 https://www.parleys.com/play/529bde2ce4b0e619540cc3ae
从功能集的角度来看,我想说 Dagger 实现的功能可以与 AndroidAnnotation 的功能进行比较@EBean
and @Bean
功能。
Summary
如果您正在比较易用性、测试支持和性能,我找不到使用 AndroidAnnotation 和 ButterKnife+Dagger 之间有多大区别。差异在于编程模型(使用带有_
而不是使用原始的并手动调用注入)和功能集中。
AndroidAnnotation 为您提供了完整的功能列表,但将您与某些库联系在一起。例如,如果您使用它的 REST API,则必须使用 Spring Android。您还可以对 OrmLite 等功能进行注释(@OrmLiteDao
)无论您是否使用 OrmLite。
最后,这是一个品味问题,至少在我看来。