我正在评估Android应用的依赖注入(DI)框架。最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations。据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充。这里是我正在寻找的关键矩阵:
答案 0 :(得分:53)
<强> AndroidAnnotations 强>
使用编译时注释处理。它会生成一个子类,其下划线附加到原始名称(MyActivity_
生成的MyActivity
)。因此,为了让它工作,你总是必须使用生成的类来代替原始类。
它有一个非常丰富的功能集,请参阅list of available annotations。
<强> 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
和@ViewsById
)和一些事件绑定(有关完整列表,请参阅命名空间目录here ,只计算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。无论是否使用OrmLite,您还可以获得OrmLite(@OrmLiteDao
)等功能的注释。
最后,这是一个品味问题,至少在我看来。
答案 1 :(得分:19)
以下是Dzone blog中的好文章。
我们需要比较每个的功能,例如:
- 所需的最低罐子
- ActionBarSherlock兼容性
- 点击侦听器的注入
- POJO注射
- 性能
只有Pojo注射液在奶油刀中丢失!看起来像Butterknife是赢家!
答案 2 :(得分:6)
但是通过阅读他们的请求,他们似乎更多地指的是Guice
和基于反射的DI库。诸如android注释之类的库不使用反射而是使用编译时生成的代码,而butterknife
和dagger
使用针对android优化的少量反射,但据称比android annotation
稍微强大一些。这实际上取决于项目以及您愿意采取多少性能影响。在我看来,只使用butterknife
就足以加速代码开发本身。如果您需要稍微多用android annotation
,最后如果您愿意因为反射而略微受到性能影响,那么最佳选择就是使用强大的基于Guice
的反射使用dagger
+而不会完全破坏性能butterknife
。
答案 3 :(得分:5)
你应该试试Toothpick。
牙签是(根据自述文件):
在大多数情况下,它甚至比Dagger 2更快,而且更简单。
注意:是的,我是作者之一。
答案 4 :(得分:3)
使用Android Annotations或Butterknife来简化您的编码。但不要去Roboguice! Roboguice强迫你的活动,碎片扩展到roboguice类。根本不好玩!
Dagger 2是一个更好的选择。如果您愿意,可以将它与Android Annotations一起使用。我只是将Android Annotations用于一个简单的应用程序,但是现在使用Dagger可以更好地工作。
答案 5 :(得分:1)
似乎Google选择了创建它的匕首they are developing it jointly with Square。
关于Butterknife和Dagger本身,有一个问题difference-between-dagger-and-butterknife-android澄清了它们如何相互补充。
答案 6 :(得分:1)
@ChrLipp提到的reddit-thread有一个人在同一个项目中使用了所有三个,高度赞扬dagger + butterknife,但也给了AndroidAnnotations:
对于依赖注入,butterknife用于Views,Dagger是 用于所有对象,强烈推荐和Android注释 创建更多用于开发Android的框架而不是 将对象注入到类中,因此每个库都是完整的 彼此不同。 Dagger相当于Guice,但是很多 快多了。 Dagger比ButterKnife和Android更强大 注释,因为它注入所有对象而不是ButterKnife和 Android注释只注入一组特定的对象。
Dagger可能很难设置和配置,但值得一试 你完成了。但话说回来,因为这些都是相当的 彼此不同,这完全取决于您的需求 该项目。
另外,在你的项目中,每个人都有很大的不同 可以使用ButterKnife,Android Annotations和Dagger 项目,如果你真的想。他们每个人都有相同的想法,但做到了 不同的东西,所以你可以使用它们。
答案 7 :(得分:1)
最终如果您使用其中一个,您将很难转换到Android的数据绑定。如果您需要考虑性能,那就是最快的:
答案 8 :(得分:0)
我认为(在性能方面)ButterKnife和AndroidAnnotation之间的差距更大。 ButterKnife使用编译时Annotation(RetentionPolicy.CLASS),但它在运行时注入代码,从而产生更多的时间。相反,AndroidAnnotations在编译时处理所有注释。