我正在评估Android应用程序的依赖注入(DI)框架.最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations.据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充.这是我正在寻找的关键矩阵:
易于使用(我们的构建基于Gradle,我们使用Android Studio IDE)
测试支持(我们使用Robotium进行功能测试,使用RoboLectric进行单元测试)
性能(DI框架使用反射,哪一个更快?)
ChrLipp.. 53
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
和@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()等功能的注释.
最后,这是一个品味问题,至少在我看来.
这是Dzone博客中的Nice文章.
我们需要比较每个的功能,例如:
需要最低罐子
ActionBarSherlock兼容性
单击侦听器的注入
POJO注射
性能
只有Pojo Injection在butterknife中丢失!看起来像Butterknife是赢家!
资源
谷歌确实特别要求不使用依赖注入.
但是通过阅读他们的请求,他们似乎更多地指的是Guice
基于反射的DI库.库,比如机器人注释使用没有反射代替采用编译时生成的代码,而butterknife
与dagger
使用反射的Android优化少量但是所谓略高于更强大android annotation
.这实际上取决于项目以及您愿意采取多少性能影响.在我看来,使用butterknife
就足以加速代码开发本身.如果你需要稍微多一些的使用android annotation
,最后如果你愿意因为反射而略微受到性能影响,那么最好的选择是在没有绝对破坏性能的情况下使用强大Guice
的反射使用dagger
+ butterknife
.
你应该试试Toothpick.
牙签是(根据自述文件):
纯java
快,它不使用反射而是注释处理
简单,灵活,可扩展和强大,强大和经过测试
线程安全
记录和开源
范围安全:它实施无泄漏的应用程序
面向测试:它使测试更容易
它适用于Android或任何其他基于上下文的框架(例如Web容器)
在大多数情况下,它甚至比Dagger 2更快,而且更简单.
注意:是的,我是作者之一.
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
和@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()等功能的注释.
最后,这是一个品味问题,至少在我看来.