Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Toothpick & Dependency Injection

Toothpick & Dependency Injection

Toothpick is a scope tree based Dependency Injection library for Java. It is a full-featured, runtime based, but reflection free, implementation of JSR 330.

Presented at Droidcon Berlin 2016

Daniel Molinero Reguera

June 15, 2016
Tweet

More Decks by Daniel Molinero Reguera

Other Decks in Programming

Transcript

  1. Dependency Injection & Toothpick https://github.com/stephanenicolas/toothpick

  2. 2/27 About us Stéphane Nicolas Senior Android Dev at Groupon

    stephanenicolas snicolas +stephane nicolas Daniel Molinero Android Dev at Groupon dlemures +DaniLemures @D_Lemures
  3. • Introduction • Dependency Injection • Libraries • Toothpick •

    Toothpick Example • Bonus: Advanced scenarios 3/27
  4. Dependencies? • Any object can be a dependency • A

    dependency of X is an object used by X to accomplish its task 4/27 Introduction
  5. Dependencies? • Any object can be a dependency • A

    dependency of X is an object used by X to accomplish its task 4/27 Introduction Snow Cone Granizado Granité Slushie ٩ဉ Granita
  6. Dependencies? • Snow Cone Machine. • Dependencies: Ice Machine +

    Syrup Dispenser 5/27 Introduction
  7. Snow Cone Machine • Dependencies: Ice Machine + Syrup Dispenser

    6/27 Introduction
  8. 7/27 Introduction Disadvantages • The class is highly coupled to

    its dependencies • It depends on its dependencies implementation details • Breaks single responsibility principle • Non reusable code • Non testable code
  9. 8/27 Dependency Injection What is Dependency Injection (DI)? • Software

    design pattern • Implements inversion of control to resolve dependencies • Dependencies are passed to the object, it does not build or find them • Separates responsibilities of use and construction • An object is independent of its dependencies implementation details
  10. Dependency Injection Snow Cone Machine • Dependencies: Ice Machine +

    Syrup Dispenser 9/27
  11. Dependency Injection Snow Cone Machine • Dependencies: Ice Machine +

    Syrup Dispenser 9/27
  12. Dependency Injection Advantages • Decreases coupling between the object and

    its dependencies • It is configurable. It does not need to know about a concrete implementation • Reusable code • Testable code 10/27
  13. 11/27 Libraries But… • Is everything so easy and perfect?

    • What about something like:
  14. 11/27 Libraries But… • Is everything so easy and perfect?

    • What about something like: Can someone do it for me??
  15. 11/27 Libraries But… • Is everything so easy and perfect?

    • What about something like: Can someone do it for me?? YES
  16. 12/27 Libraries Dependency Injection Libraries • They create and inject

    dependencies for us • Just specify what are the dependencies and how to build them • Two main libraries for Android: • Roboguice • Dagger
  17. 13/27 Libraries Roboguice • Android oriented • It uses Guice,

    a Google DI library • Does most of work at runtime • Really simple and powerful solution
  18. 13/27 Libraries Roboguice • Android oriented • It uses Guice,

    a Google DI library • Does most of work at runtime • Really simple and powerful solution • Uses reflection heavily, being quite slow • Uses Guava, with thousand of methods, contributing to reaching the dex limit and big APKs
  19. 14/27 Libraries Dagger • Java and Android oriented • Does

    most of work at compile time • Reflection replaced by annotation processing • Great performance
  20. 14/27 Libraries Dagger • Java and Android oriented • Does

    most of work at compile time • Reflection replaced by annotation processing • Great performance • Harder to use and require boiler plate code • Dependency Injection graph is completely static, defined at compile time
  21. 15/27 Libraries High level overview Ease of use Speed Roboguice

    Dagger
  22. 15/27 Libraries High level overview Ease of use Speed Roboguice

    Dagger Toothpick
  23. 16/27 Toothpick What is Toothpick? • Scope tree based Dependency

    Injection library • Full featured implementation of the JSR 330 • Runtime based, but does not use reflection. Replaced by annotation processing • Almost as fast as Dagger, even faster in some cases • As simple as Roboguice, with few rules • Advanced testing support
  24. 16/27 Toothpick What is Toothpick? • Scope tree based Dependency

    Injection library • Full featured implementation of the JSR 330 • Runtime based, but does not use reflection. Replaced by annotation processing • Almost as fast as Dagger, even faster in some cases • As simple as Roboguice, with few rules • Advanced testing support
  25. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 17/27
  26. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 17/27 Specify Dependencies
  27. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 17/27 Specify Dependencies Inject all dependencies and transitive dependencies
  28. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 18/27
  29. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 18/27 Transitive Dependencies
  30. Toothpick Snow Cone Machine • Dependencies: Ice Machine + Syrup

    Dispenser 18/27 Annotated Constructor Transitive Dependencies
  31. 19/27 Toothpick Snow Cone Machine Syrup Dispenser Snow Cone Machine

    • Transitive dependencies Ice Machine Pump Transitive Dependency
  32. 19/27 Toothpick Snow Cone Machine Syrup Dispenser Snow Cone Machine

    • Transitive dependencies Ice Machine Pump Transitive Dependency
  33. 20/27 Toothpick Example Requirements • Different flavor Snow Cone Machines:

    Lemon and Apple • Only one Ice Machine, it is shared • It should be an easy and fast solution:
  34. 20/27 Toothpick Example Requirements • Different flavor Snow Cone Machines:

    Lemon and Apple • Only one Ice Machine, it is shared • It should be an easy and fast solution: Toothpick to the rescue!!
  35. 21/27 Toothpick Example 2 Snow Cone Machines: Lemon and Apple

    • Scopes are used to define overrides: bindings • Bindings are attached to the Scopes through modules
  36. 21/27 Toothpick Example 2 Snow Cone Machines: Lemon and Apple

    • Scopes are used to define overrides: bindings • Bindings are attached to the Scopes through modules
  37. 21/27 Toothpick Example 2 Snow Cone Machines: Lemon and Apple

    • Scopes are used to define overrides: bindings • Bindings are attached to the Scopes through modules
  38. 22/27 Toothpick Example 2 Snow Cone Machines: Lemon and Apple

  39. 23/27 Toothpick Example Scope tree based D -> E X

    -> Y A -> B T -> Z
  40. 24/27 Toothpick Example Only one Ice Machine, it is shared

    • The Ice Machine is a Singleton • Use @Singleton annotation
  41. 25/27 Bonus: Advanced scenarios • MVP, keeping the presenter state

    • Nowadays -> Retained fragments, Loaders, … • Toothpick -> Use a scope to retain the instance of the Presenter • User flow data • Nowadays -> Send data over and over through Intents, Database, … • Toothpick -> Use a common scope for the whole flow to keep flow related data
  42. 26/27 Conclusion • Toothpick is scope tree based DI framework

    • Advanced testing support • Nice scenarios: MVP, Flow Scope, … • Fast and simple
  43. 26/27 Conclusion • Toothpick is scope tree based DI framework

    • Advanced testing support • Nice scenarios: MVP, Flow Scope, … • Fast and simple How Fast?
  44. 26/27 Conclusion • Toothpick is scope tree based DI framework

    • Advanced testing support • Nice scenarios: MVP, Flow Scope, … • Fast and simple How Fast?
  45. 27/27 Conclusion 1000 injections • Dagger 1: 33 ms •

    Dagger 2: 31 ms • Toothpick: 35 ms 6400 injections • Dagger 1: 45 ms • Dagger 2: 42 ms • Toothpick: 66 ms
  46. The Android Team is Hiring https://jobs.groupon.com/#/categories/engineering