匕首和黄油刀与Android注释

use*_*846 63 android dependency-injection android-annotations dagger butterknife

我正在评估Android应用程序的依赖注入(DI)框架.最有力的竞争者是:Dagger(有Butter Knife)和Android Annotations.据我所知,Dagger和ButterKnife来自同一个源头,他们相互补充.这是我正在寻找的关键矩阵:

  1. 易于使用(我们的构建基于Gradle,我们使用Android Studio IDE)
  2. 测试支持(我们使用Robotium进行功能测试,使用RoboLectric进行单元测试)
  3. 性能(DI框架使用反射,哪一个更快?)

Chr*_*ipp 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...
}
Run Code Online (Sandbox Code Playgroud)

功能集不是那么丰富,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
}
Run Code Online (Sandbox Code Playgroud)

我发现用匕首开始更难,但这可能只是我的经验.但看到一些视频在这里美好的开始:1,2

从功能设置的角度来看,我会说Dagger实现了可以与AndroidAnnotation @EBean@Bean功能进行比较的功能.

总结
如果您要比较易用性,测试支持和性能,我在使用AndroidAnnotation和ButterKnife + Dagger之间找不到太多区别.编程模型中的差异(使用类_而不是使用原始类并手动调用注入)和功能集中.

AndroidAnnotation为您提供了完整的功能列表,但您可以将其与某些库联系起来.例如,如果你使用它的rest api,你必须使用Spring Android.@OrmLiteDao无论是否使用OrmLite,您还可以获得OrmLite()等功能的注释.

最后,这是一个品味问题,至少在我看来.

  • 我认为所有解决方案都会在编译期间生成代码,并且(在运行时)调用此代码来执行注入.例如,在Android Annotations中,它生成一个子类(`MyActivity_`),它执行"MyActivity"的注入.在Butterknife中你必须调用`ButterKnife.inject(this)`来委托生成的代码. (3认同)

LOG*_*TAG 19

这是Dzone博客中的Nice文章.

我们需要比较每个的功能,例如:

  • 需要最低罐子
  • ActionBarSherlock兼容性
  • 单击侦听器的注入
  • POJO注射
  • 性能

在此输入图像描述

只有Pojo Injection在butterknife中丢失!看起来像Butterknife是赢家!

资源


Cha*_*sen 7

谷歌确实特别要求不使用依赖注入.

但是通过阅读他们的请求,他们似乎更多地指的是Guice基于反射的DI库.库,比如机器人注释使用没有反射代替采用编译时生成的代码,而butterknifedagger使用反射的Android优化少量但是所谓略高于更强大android annotation.这实际上取决于项目以及您愿意采取多少性能影响.在我看来,使用butterknife就足以加速代码开发本身.如果你需要稍微多一些的使用android annotation,最后如果你愿意因为反射而略微受到性能影响,那么最好的选择是在没有绝对破坏性能的情况下使用强大Guice的反射使用dagger+ butterknife.

  • Google正联合开发dagger2:http://google.github.io/dagger/ (11认同)

Sni*_*las 5

你应该试试Toothpick.

牙签是(根据自述文件):

  • 纯java
  • 快,它不使用反射而是注释处理
  • 简单,灵活,可扩展和强大,强大和经过测试
  • 线程安全
  • 记录和开源
  • 范围安全:它实施无泄漏的应用程序
  • 面向测试:它使测试更容易
  • 它适用于Android或任何其他基于上下文的框架(例如Web容器)

在大多数情况下,它甚至比Dagger 2更快,而且更简单.

注意:是的,我是作者之一.