AndroidAnnotations
使用编译时注解处理。它生成一个带有下划线附加到原始名称(MyActivity_
生成自MyActivity
)的子类。所以要让它工作,你总是必须使用生成的类而不是你的原始类来引用。
它具有非常丰富的功能集,请参阅可用注释列表。
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
)和一些事件绑定(完整列表请参见此处的命名空间目录,仅计算OnXXX
事件注释)。
Dagger
是 Android 的 DI 实现,类似于 Guice。它还使用编译时注释处理并生成用于手动注入的对象图。您可以区分应用程序对象图和作用域对象图,例如在活动中注入。在这里您可以看到一个Application.onCreate
示例:
@Override public void onCreate() {
super.onCreate();
objectGraph = ObjectGraph.create(getModules().toArray());
objectGraph.inject(this);
// use injected classes
}
我发现从匕首开始更难,但这可能只是我的经验。但是,请在此处查看一些视频以获得更好的开始:1、2
从功能集的角度来看,我会说 Dagger 实现了可以与 AndroidAnnotation@EBean
和功能进行比较的@Bean
功能。
总结
如果您比较易用性、测试支持和性能,我发现使用 AndroidAnnotation 和 ButterKnife+Dagger 之间没有太大区别。差异在于编程模型(使用类_
而不是使用原始类并手动调用注入)和功能集。
AndroidAnnotation 为您提供了完整的功能列表,但会将您与某些库联系起来。例如,如果你使用它的 rest api,你必须使用 Spring Android。@OrmLiteDao
无论您是否使用 OrmLite,您还可以对 OrmLite ( ) 等功能进行注释。
最后,至少在我看来,这是一个品味问题。