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

Dependency Injection with Dagger 2 (Devoxx 2014)

Dependency Injection with Dagger 2 (Devoxx 2014)

Dagger is a fast dependency injector for both Java and Android. Its second major version not only brings new features for parity with other frameworks but continues to push the boundaries of speed.

The concepts covered in this talk apply to both Java targeting the JVM and Android.

Video: https://parleys.com/play/5471cdd1e4b065ebcfa1d557/

Jake Wharton
PRO

November 13, 2014
Tweet

More Decks by Jake Wharton

Other Decks in Technology

Transcript

  1. dependency injection with
    Dagger 2
    Jake Wharton

    View Slide

  2. Dependency Injection
    flickr.com/photos/sunsetnoir/6984108500

    View Slide

  3. Dependency Injection
    • No “new”, dependencies come to you
    flickr.com/photos/sunsetnoir/6984108500

    View Slide

  4. Dependency Injection
    • First and foremost a pattern

    View Slide

  5. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection

    View Slide

  6. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection
    Tweeter

    View Slide

  7. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection
    Twitter API
    Tweeter

    View Slide

  8. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection
    Twitter API
    Tweeter HTTP Client

    View Slide

  9. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi();

    api.postTweet("JakeWharton", tweet);

    }

    }

    View Slide

  10. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi();

    api.postTweet("JakeWharton", tweet);

    }

    }
    public class TwitterApi {

    public void postTweet(String user, String tweet) {

    OkHttpClient client = new OkHttpClient();

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  11. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi();

    api.postTweet("JakeWharton", tweet);

    }

    }
    public class TwitterApi {

    public void postTweet(String user, String tweet) {

    OkHttpClient client = new OkHttpClient();

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }
    Tweeter tweeter = new Tweeter();

    tweeter.tweet("Hello, #Devoxx 2014!");

    View Slide

  12. public class TwitterApi {

    public void postTweet(String user, String tweet) {

    OkHttpClient client = new OkHttpClient();

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  13. public class TwitterApi {

    private final OkHttpClient client = new OkHttpClient();


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  14. public class TwitterApi {

    private final OkHttpClient client = new OkHttpClient();


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  15. public class TwitterApi {

    private final OkHttpClient client;


    public TwitterApi(OkHttpClient client) {

    this.client = client;

    }


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  16. public class TwitterApi {

    private final OkHttpClient client;


    public TwitterApi(OkHttpClient client) {

    this.client = client;

    }


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request...

    client.newCall(request).execute();

    }

    }

    View Slide

  17. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi();

    api.postTweet("JakeWharton", tweet);

    }
    }

    View Slide

  18. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi(new OkHttpClient());

    api.postTweet("JakeWharton", tweet);

    }

    }

    View Slide

  19. public class Tweeter {

    public void tweet(String tweet) {

    TwitterApi api = new TwitterApi(new OkHttpClient());

    api.postTweet("JakeWharton", tweet);

    }

    }

    View Slide

  20. public class Tweeter {

    private final TwitterApi api = new TwitterApi(new OkHttpClient());


    public void tweet(String tweet) {

    api.postTweet("JakeWharton", tweet);

    }

    }

    View Slide

  21. public class Tweeter {

    private final TwitterApi api = new TwitterApi(new OkHttpClient());


    public void tweet(String tweet) {

    api.postTweet("JakeWharton", tweet);

    }

    }

    View Slide

  22. public class Tweeter {

    private final TwitterApi api = new TwitterApi(new OkHttpClient());

    private final String user;


    public Tweeter(String user) {

    this.user = user;

    }


    public void tweet(String tweet) {

    api.postTweet(user, tweet);

    }

    }

    View Slide

  23. public class Tweeter {

    private final TwitterApi api = new TwitterApi(new OkHttpClient());

    private final String user;


    public Tweeter(String user) {

    this.user = user;

    }


    public void tweet(String tweet) {

    api.postTweet(user, tweet);

    }

    }

    View Slide

  24. Tweeter tweeter = new Tweeter();

    tweeter.tweet("Hello, #Devoxx 2014!");

    View Slide

  25. Tweeter tweeter = new Tweeter("JakeWharton");

    tweeter.tweet("Hello, #Devoxx 2014!");

    View Slide

  26. Tweeter tweeter = new Tweeter("JakeWharton");

    tweeter.tweet("Hello, #Devoxx 2014!");

    View Slide

  27. Tweeter tweeter = new Tweeter("JakeWharton");

    tweeter.tweet("Hello, #Devoxx 2014!");
    !

    tweeter.tweet("#Hungover #Dagger");
    !

    tweeter.tweet("Waffles, beer, diamonds, chocolate, and Dagger!");
    !

    !
    tweeter.tweet("Java Posse ain’t got nothing on #Dagger");
    !

    !
    !
    tweeter.tweet("Are these the same slides from last year? #meta");
    !

    !
    !
    !
    tweeter.tweet("I need an injection of beer, amirite? #Dagger");

    View Slide

  28. Tweeter tweeter = new Tweeter("JakeWharton");

    tweeter.tweet("Hello, #Devoxx 2014!");
    !

    tweeter.tweet("#Hungover #Dagger");
    !

    tweeter.tweet("Waffles, beer, diamonds, chocolate, and Dagger!");
    !

    !
    tweeter.tweet("Java Posse ain’t got nothing on #Dagger");
    !

    !
    !
    tweeter.tweet("Are these the same slides from last year? #meta");
    !

    !
    !
    !
    tweeter.tweet("I need an injection of beer, amirite? #Dagger");
    Timeline timeline = new Timeline("JakeWharton");

    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    View Slide

  29. public class Timeline {

    private final List cache = new ArrayList<>();

    private final TwitterApi api = new TwitterApi(new OkHttpClient());

    private final String user;


    public Timeline(String user) {

    this.user = user;

    }


    public List get() { /* ... */ }

    public void loadMore(int amount) { /* ... */ }

    }

    View Slide

  30. public class Timeline {

    private final List cache = new ArrayList<>();

    private final TwitterApi api;

    private final String user;


    public Timeline(TwitterApi api, String user) {

    this.api = api;

    this.user = user;

    }


    public List get() { /* ... */ }

    public void loadMore(int amount) { /* ... */ }

    }

    View Slide

  31. public class Timeline {

    private final List cache = new ArrayList<>();

    private final TwitterApi api;

    private final String user;


    public Timeline(TwitterApi api, String user) {

    this.api = api;

    this.user = user;

    }


    public List get() { /* ... */ }

    public void loadMore(int amount) { /* ... */ }

    }

    View Slide

  32. public class Tweeter {

    private final TwitterApi api = new TwitterApi(new OkHttpClient());

    private final String user;


    public Tweeter(String user) {

    this.user = user;

    }


    public void tweet(String tweet) {

    api.postTweet(user, tweet);

    }

    }

    View Slide

  33. public class Tweeter {

    private final TwitterApi api;

    private final String user;


    public Tweeter(TwitterApi api, String user) {

    this.api = api;

    this.user = user;

    }


    public void tweet(String tweet) {

    api.postTweet(user, tweet);

    }

    }

    View Slide

  34. public class Tweeter {

    private final TwitterApi api;

    private final String user;


    public Tweeter(TwitterApi api, String user) {

    this.api = api;

    this.user = user;

    }


    public void tweet(String tweet) {

    api.postTweet(user, tweet);

    }

    }

    View Slide

  35. Tweeter tweeter = new Tweeter("JakeWharton");

    tweeter.tweet("Hello, #Devoxx 2014!");


    Timeline timeline = new Timeline("JakeWharton");

    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    View Slide

  36. OkHttpClient client = new OkHttpClient();

    TwitterApi api = new TwitterApi(client);

    String user = "Jake Wharton";


    Tweeter tweeter = new Tweeter(api, user);

    tweeter.tweet("Hello, #Devoxx 2014!");


    Timeline timeline = new Timeline(api, user);

    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    View Slide

  37. OkHttpClient client = new OkHttpClient();

    TwitterApi api = new TwitterApi(client);

    String user = "Jake Wharton";


    Tweeter tweeter = new Tweeter(api, user);

    tweeter.tweet("Hello, #Devoxx 2014!");


    Timeline timeline = new Timeline(api, user);

    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    View Slide

  38. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection
    Twitter API
    Tweeter HTTP Client

    View Slide

  39. Dependency Injection
    • First and foremost a pattern
    • Every single app has some form of dependency injection
    Twitter API
    Tweeter
    HTTP Client
    Tweeter

    View Slide

  40. Dependency Injection
    Twitter API
    Tweeter
    HTTP Client
    Tweeter
    • How do we avoid the boilerplate that comes with the pattern?

    View Slide

  41. Library Rescue
    • Spring
    • Guice
    • Dagger (v1)
    • PicoContainer
    • CDI
    • Others…

    View Slide

  42. Guice Dagger
    (v1)

    View Slide

  43. Guice

    View Slide

  44. Guice
    • Developed at Google by Bob Lee, later Jesse Wilson, others.

    View Slide

  45. Guice
    • Developed at Google by Bob Lee, later Jesse Wilson, others.
    • Adopted and maintained by Java Core Libraries team.

    View Slide

  46. Guice
    • Developed at Google by Bob Lee, later Jesse Wilson, others.
    • Adopted and maintained by Java Core Libraries team.
    • Powerful, dynamic, well-tested, wide-spread, etc…

    View Slide

  47. Guice
    • Developed at Google by Bob Lee, later Jesse Wilson, others.
    • Adopted and maintained by Java Core Libraries team.
    • Powerful, dynamic, well-tested, wide-spread, etc…
    • Configuration problems occur at runtime.

    View Slide

  48. Guice
    • Developed at Google by Bob Lee, later Jesse Wilson, others.
    • Adopted and maintained by Java Core Libraries team.
    • Powerful, dynamic, well-tested, wide-spread, etc…
    • Configuration problems occur at runtime.
    • Slow initialization, slow injection, memory concerns.

    View Slide

  49. Dagger (v1)

    View Slide

  50. Dagger (v1)
    • Developed at Square by Jesse Wilson advised by Bob Lee.

    View Slide

  51. Dagger (v1)
    • Developed at Square by Jesse Wilson advised by Bob Lee.
    • Initially targeted at highly resource constrained environments.

    View Slide

  52. Dagger (v1)
    • Developed at Square by Jesse Wilson advised by Bob Lee.
    • Initially targeted at highly resource constrained environments.
    • Static analysis of all dependencies and injection points.

    View Slide

  53. Dagger (v1)
    • Developed at Square by Jesse Wilson advised by Bob Lee.
    • Initially targeted at highly resource constrained environments.
    • Static analysis of all dependencies and injection points.
    • Fail as early as possible (compile-time, not runtime)

    View Slide

  54. Dagger (v1)
    • Developed at Square by Jesse Wilson advised by Bob Lee.
    • Initially targeted at highly resource constrained environments.
    • Static analysis of all dependencies and injection points.
    • Fail as early as possible (compile-time, not runtime)
    • Eliminate reflection on methods, fields, and annotations.

    View Slide

  55. Dagger (v1)

    View Slide

  56. Dagger (v1)
    • Wide-spread, successful use in large Android applications.

    View Slide

  57. Dagger (v1)
    • Wide-spread, successful use in large Android applications.
    • Triggers over-eager class loading on graph creation.

    View Slide

  58. Dagger (v1)
    • Wide-spread, successful use in large Android applications.
    • Triggers over-eager class loading on graph creation.
    • FQCN string-based keys in map-like data structure.

    View Slide

  59. Dagger (v1)
    • Wide-spread, successful use in large Android applications.
    • Triggers over-eager class loading on graph creation.
    • FQCN string-based keys in map-like data structure.
    • Lack of full static scope analysis and scope annotations.

    View Slide

  60. Dagger (v1)
    • Wide-spread, successful use in large Android applications.
    • Triggers over-eager class loading on graph creation.
    • FQCN string-based keys in map-like data structure.
    • Lack of full static scope analysis and scope annotations.
    • Still uses reflection to load generated classes.

    View Slide

  61. Dagger (v2)

    View Slide

  62. Dagger (v2)
    • Proposed and implemented by Java Core Libraries team.

    View Slide

  63. Dagger (v2)
    • Proposed and implemented by Java Core Libraries team.
    • Eliminate runtime library and generated code overhead.

    View Slide

  64. Dagger (v2)
    • Proposed and implemented by Java Core Libraries team.
    • Eliminate runtime library and generated code overhead.
    • Shift remaining runtime analysis to compile time.

    View Slide

  65. Dagger (v2)
    • Proposed and implemented by Java Core Libraries team.
    • Eliminate runtime library and generated code overhead.
    • Shift remaining runtime analysis to compile time.
    • Scoping with annotations and associated static analysis.

    View Slide

  66. Dagger API

    View Slide

  67. Dagger API
    • @Module + @Provides: mechanism for providing dependencies.

    View Slide

  68. Dagger API
    • @Module + @Provides: mechanism for providing dependencies.
    • @Inject: mechanism for requesting dependencies.

    View Slide

  69. Dagger API
    • @Module + @Provides: mechanism for providing dependencies.
    • @Inject: mechanism for requesting dependencies.
    • @Component: bridge between modules and injections

    View Slide

  70. Dagger API
    • @Module + @Provides: mechanism for providing dependencies.
    • @Inject: mechanism for requesting dependencies.
    • @Component: bridge between modules and injections
    • Plus some other sugar, magic, and conventions.

    View Slide

  71. Providing Dependencies

    View Slide

  72. Providing Dependencies
    • Modules are classes whose methods provide dependencies.

    View Slide

  73. Providing Dependencies
    • Modules are classes whose methods provide dependencies.
    • @Module on the class.

    View Slide

  74. Providing Dependencies
    • Modules are classes whose methods provide dependencies.
    • @Module on the class.
    • @Provides (and friends) on each method.

    View Slide


  75. public class NetworkModule {


    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }



    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }

    View Slide


  76. public class NetworkModule {


    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }



    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }
    @Module

    View Slide


  77. public class NetworkModule {


    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }



    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }
    @Module
    !
    !
    @Provides
    !
    !
    !
    !
    !
    !
    !
    @Provides

    View Slide


  78. public class NetworkModule {


    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }



    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }
    @Module
    !
    !
    @Provides
    !
    !
    !
    !
    !
    !
    !
    @Provides
    !
    !
    @Singleton
    !
    !
    !
    !
    !
    !
    !
    @Singleton

    View Slide

  79. Providing Dependencies

    View Slide

  80. Providing Dependencies
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  81. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  82. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  83. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    View Slide

  84. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  85. Providing Dependencies
    • Modules are classes whose methods provide dependencies.
    • @Module on the class.
    • @Provides (and friends) on each method.

    View Slide

  86. Providing Dependencies
    • Modules are classes whose methods provide dependencies.
    • @Module on the class.
    • @Provides (and friends) on each method.
    !
    !
    !
    • Designed to be partitioned and composed together.

    View Slide


  87. public class TwitterModule {
















    }

    View Slide


  88. public class TwitterModule {
















    }
    @Module

    View Slide


  89. public class TwitterModule {
















    }


    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }
    @Module

    View Slide


  90. public class TwitterModule {
















    }


    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }

    public class TwitterModule {







    @Provides @Singleton

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }
    @Module

    View Slide


  91. public class TwitterModule {
















    }


    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }

    public class TwitterModule {







    @Provides @Singleton

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }













    @Provides @Singleton

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }
    @Module

    View Slide

  92. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  93. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline

    View Slide

  94. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline

    View Slide

  95. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline

    View Slide

  96. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter

    View Slide

  97. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter

    View Slide

  98. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter

    View Slide

  99. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter

    View Slide

  100. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi

    View Slide

  101. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi

    View Slide

  102. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi

    View Slide

  103. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi

    View Slide

  104. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient

    View Slide

  105. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient

    View Slide

  106. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient NetworkModule#provideOkHttpClient

    View Slide

  107. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient NetworkModule#provideOkHttpClient
    NetworkModule#provideOkHttpClient

    View Slide

  108. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient NetworkModule#provideOkHttpClient
    OkHttpClient

    View Slide

  109. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient
    OkHttpClient

    View Slide

  110. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient
    OkHttpClient
    NetworkModule#provideTwitterApi

    View Slide

  111. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi NetworkModule#provideTwitterApi
    OkHttpClient
    OkHttpClient
    NetworkModule#provideTwitterApi
    TwitterApi

    View Slide

  112. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi

    View Slide

  113. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter TwitterModule#provideTweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi
    TwitterModule#provideTweeter

    View Slide

  114. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi
    TwitterModule#provideTweeter
    Tweeter

    View Slide

  115. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi
    Tweeter

    View Slide

  116. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi
    Tweeter

    View Slide

  117. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Tweeter
    TwitterApi
    OkHttpClient
    OkHttpClient
    TwitterApi
    Tweeter

    View Slide

  118. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline

    View Slide

  119. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline TwitterModule#provideTimeline

    View Slide

  120. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline TwitterModule#provideTimeline

    View Slide

  121. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline TwitterModule#provideTimeline
    TwitterModule#provideTimeline

    View Slide

  122. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline TwitterModule#provideTimeline
    Timeline

    View Slide

  123. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline
    Timeline

    View Slide

  124. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline
    Timeline

    View Slide

  125. Providing Dependencies
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline
    Timeline
    Timeline

    View Slide

  126. Requesting Dependencies

    View Slide

  127. Requesting Dependencies
    • @Inject annotation required.

    View Slide

  128. Requesting Dependencies
    • @Inject annotation required.
    • Constructor, field, and method injection.

    View Slide

  129. Constructor Injection

    View Slide

  130. Constructor Injection
    • @Inject on a single constructor.

    View Slide

  131. Constructor Injection
    • @Inject on a single constructor.
    • Constructor parameters are dependencies.

    View Slide

  132. Constructor Injection
    • @Inject on a single constructor.
    • Constructor parameters are dependencies.
    • Dependencies can be stored in private and final fields.

    View Slide

  133. public class TwitterApplication {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }


    // ...

    }

    View Slide

  134. Constructor Injection
    • @Inject on a single constructor.
    • Constructor parameters are dependencies.
    • Dependencies can be stored in private and final fields.

    View Slide

  135. Constructor Injection
    • @Inject on a single constructor.
    • Constructor parameters are dependencies.
    • Dependencies can be stored in private and final fields.
    • Implicitly made available for downstream injection.

    View Slide

  136. @Module

    public class NetworkModule {

    @Provides @Singleton

    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }


    @Provides @Singleton

    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }

    View Slide

  137. @Module

    public class NetworkModule {

    @Provides @Singleton

    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }


    @Provides @Singleton

    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }







    @Provides @Singleton












    TwitterApi provideTwitterApi(OkHttpClient client) {












    return new TwitterApi(client);












    }

    }

    View Slide

  138. public class TwitterApi {

    private final OkHttpClient client;




    public TwitterApi(OkHttpClient client) {

    this.client = client;

    }


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request ...

    client.newCall(request).execute();

    }

    }

    View Slide

  139. public class TwitterApi {

    private final OkHttpClient client;




    public TwitterApi(OkHttpClient client) {

    this.client = client;

    }


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request ...

    client.newCall(request).execute();

    }

    }



    @Inject

    View Slide

  140. public class TwitterApi {

    private final OkHttpClient client;




    public TwitterApi(OkHttpClient client) {

    this.client = client;

    }


    public void postTweet(String user, String tweet) {

    Request request = // TODO build POST request ...

    client.newCall(request).execute();

    }

    }



    @Inject
    @Singleton

    View Slide

  141. Method Injection

    View Slide

  142. Method Injection
    • @Inject on methods.

    View Slide

  143. Method Injection
    • @Inject on methods.
    • Method parameters are dependencies.

    View Slide

  144. Method Injection
    • @Inject on methods.
    • Method parameters are dependencies.
    • Injection happens after object is fully instantiated.

    View Slide

  145. Method Injection
    • @Inject on methods.
    • Method parameters are dependencies.
    • Injection happens after object is fully instantiated.
    • Only one valid use case: passing ‘this’ to a dependency.

    View Slide

  146. public class TwitterApplication {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }





    }

    View Slide

  147. public class TwitterApplication {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }





    }
    public class TwitterApplication {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }





    }
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    @Inject

    public void enableStreaming(Streaming streaming) {

    streaming.register(this);

    }

    View Slide

  148. public class TwitterApplication {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }





    }
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    @Inject

    public void enableStreaming(Streaming streaming) {

    streaming.register(this);

    }

    View Slide

  149. Field Injection

    View Slide

  150. Field Injection
    • @Inject on fields for dependencies.

    View Slide

  151. Field Injection
    • @Inject on fields for dependencies.
    • Field may not be private or final.

    View Slide

  152. public class TwitterApplication {

    @Inject Tweeter tweeter;

    @Inject Timeline timeline;


    // ...

    }

    View Slide

  153. public class TwitterActivity extends Activity {

    @Inject Tweeter tweeter;

    @Inject Timeline timeline;


    // ...

    }

    View Slide

  154. public class TwitterProcessor extends AbstractProcessor {

    @Inject Tweeter tweeter;

    @Inject Timeline timeline;


    // ...

    }

    View Slide

  155. Field Injection
    • @Inject on fields for dependencies.
    • Field may not be private or final.

    View Slide

  156. Field Injection
    • @Inject on fields for dependencies.
    • Field may not be private or final.
    • Injection happens after the object is fully instantiated.

    View Slide

  157. Field Injection
    • @Inject on fields for dependencies.
    • Field may not be private or final.
    • Injection happens after the object is fully instantiated.
    • Object is usually responsible for or aware of injection.

    View Slide

  158. Components

    View Slide

  159. Components
    • Bridge between modules and injection.

    View Slide

  160. Components
    • Bridge between modules and injection.
    • The injector.

    View Slide

  161. @Component
    !
    public interface TwitterComponent {


    }

    View Slide

  162. @Component
    !
    public interface TwitterComponent {


    }
    (modules = {
    NetworkModule.class,

    TwitterModule.class,

    })

    View Slide

  163. @Component
    !
    public interface TwitterComponent {


    }
    (modules = {
    NetworkModule.class,

    TwitterModule.class,

    })
    @Singleton

    View Slide

  164. @Component





    Tweeter tweeter();

    Timeline timeline();
    !
    public interface TwitterComponent {


    }
    (modules = {
    NetworkModule.class,

    TwitterModule.class,

    })
    @Singleton

    View Slide

  165. TwitterComponent component = Dagger_TwitterComponent.builder()

    .networkModule(new NetworkModule())

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    View Slide

  166. TwitterComponent component = Dagger_TwitterComponent.builder()

    .networkModule(new NetworkModule())

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    !
    !
    !
    !
    !
    !
    Timeline timeline = component.timeline();
    !
    !
    !
    !

    Tweeter tweeter = component.tweeter();

    View Slide

  167. TwitterComponent component = Dagger_TwitterComponent.builder()


    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    !
    Tweeter tweeter = component.tweeter();

    .networkModule(new NetworkModule())

    .networkModule(new NetworkModule())



    !
    !
    Timeline timeline = component.timeline();

    View Slide

  168. TwitterComponent component = Dagger_TwitterComponent.builder()


    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    !
    Tweeter tweeter = component.tweeter();



    !
    !
    Timeline timeline = component.timeline();

    View Slide

  169. TwitterComponent component = Dagger_TwitterComponent.builder()


    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    !
    Tweeter tweeter = component.tweeter();
    tweeter.tweet("Hello, #Devoxx 2014!");
    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }



    !
    !
    Timeline timeline = component.timeline();

    View Slide

  170. public class TwitterApplication implements Runnable {

    private final Tweeter tweeter;

    private final Timeline timeline;


    @Inject

    public TwitterApplication(Tweeter tweeter, Timeline timeline) {

    this.tweeter = tweeter;

    this.timeline = timeline;

    }


    @Override public void run() {

    tweeter.tweet("Hello #Devoxx 2014!");


    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    }

    }

    View Slide

  171. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  172. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    TwitterApplication app();

    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    component.app().run();

    View Slide

  173. public class TwitterApplication implements Runnable {

    @Inject Tweeter tweeter;

    @Inject Timeline timeline;


    @Override public void run() {

    tweeter.tweet("Hello #Devoxx 2014!");


    timeline.loadMore(20);

    for (Tweet tweet : timeline.get()) {

    System.out.println(tweet);

    }

    }
    }

    View Slide

  174. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectApp(TwitterApplication app);
    }

    View Slide

  175. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectApp(TwitterApplication app);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    View Slide

  176. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectApp(TwitterApplication app);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterApplication app = new TwitterApplication();

    component.injectApp(app);

    app.run();

    View Slide

  177. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectActivity(TwitterActivity activity);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterActivity activity = // Android creates instance...

    component.injectActivity(activity);
    @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectActivity(TwitterActivity activity);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    View Slide

  178. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectActivity(TwitterActivity activity);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterActivity activity = // Android creates instance...

    component.injectActivity(activity);

    View Slide

  179. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectProcessor(TwitterProcessor processor);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterProcessor processor = // ServiceLoader creates instance...

    component.injectProcessor(processor);
    @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectProcessor(TwitterProcessor processor);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    View Slide

  180. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    void injectProcessor(TwitterProcessor processor);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterProcessor processor = // ServiceLoader creates instance...

    component.injectProcessor(processor);

    View Slide

  181. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    TwitterApplication injectApp(TwitterApplication app);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterApplication app = new TwitterApplication();

    component.injectApp(app).run();
    @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    TwitterApplication injectApp(TwitterApplication app);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();

    View Slide

  182. @Singleton
    @Component(modules = {

    NetworkModule.class,

    TwitterModule.class,

    })

    interface TwitterComponent {

    TwitterApplication injectApp(TwitterApplication app);
    }
    TwitterComponent component = Dagger_TwitterComponent.builder()

    .twitterModule(new TwitterModule("JakeWharton"))

    .build();
    TwitterApplication app = new TwitterApplication();

    component.injectApp(app).run();

    View Slide

  183. Components
    • Bridge between modules and injection.
    • The injector.

    View Slide

  184. Components
    • Bridge between modules and injection.
    • The injector.
    • Implementation of scopes.

    View Slide

  185. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {



    }

    View Slide

  186. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {



    }
    @Component(

    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  187. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {



    }
    @Component(

    dependencies = ApiComponent.class,

    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  188. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {



    }



    TwitterApi api();

    @Component(

    dependencies = ApiComponent.class,

    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  189. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {
    TwitterApi api();
    }
    @Component(

    dependencies = ApiComponent.class,
    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }
    @Singleton

    View Slide

  190. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {
    TwitterApi api();
    }
    @Component(

    dependencies = ApiComponent.class,
    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }
    @Singleton

    View Slide

  191. @Singleton

    @Component(modules = NetworkModule.class)

    public interface ApiComponent {
    TwitterApi api();
    }
    @Component(

    dependencies = ApiComponent.class,
    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  192. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides @Singleton

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides @Singleton

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }

    View Slide

  193. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides @Singleton

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides @Singleton

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }

    View Slide

  194. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }

    View Slide

  195. ApiComponent apiComponent = Dagger_ApiComponent. builder().build();

    View Slide

  196. ApiComponent apiComponent = Dagger_ApiComponent. create();
    ApiComponent apiComponent = Dagger_ApiComponent.

    View Slide

  197. ApiComponent apiComponent = Dagger_ApiComponent. create();

    View Slide

  198. ApiComponent apiComponent = Dagger_ApiComponent. create();
    TwitterComponent twitterComponent = Dagger_TwitterComponent.builder()

    .apiComponent(apiComponent)

    .twitterModule(new TwitterModule("Jake Wharton"))

    .build();

    View Slide

  199. ApiComponent apiComponent = Dagger_ApiComponent. create();
    TwitterComponent twitterComponent = Dagger_TwitterComponent.builder()

    .apiComponent(apiComponent)

    .twitterModule(new TwitterModule("Jake Wharton"))

    .build();
    component.app().run();

    View Slide

  200. Scope Annotations

    View Slide

  201. Scope Annotations
    • Only create a single instance.

    View Slide

  202. Scope Annotations
    • Only create a single instance.
    • @Singleton is the “largest” scope.

    View Slide

  203. Scope Annotations
    • Only create a single instance.
    • @Singleton is the “largest” scope.
    • Custom annotations for semantic clarity, shorter lifetime.

    View Slide

  204. public @interface User {

    }
    Scope Annotations
    • Only create a single instance.
    • @Singleton is the “largest” scope.
    • Custom annotations for semantic clarity, shorter lifetime.

    View Slide

  205. public @interface User {

    }
    @Scope
    Scope Annotations
    • Only create a single instance.
    • @Singleton is the “largest” scope.
    • Custom annotations for semantic clarity, shorter lifetime.

    View Slide

  206. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }

    View Slide

  207. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }
    @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides @User

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides @User

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }

    View Slide

  208. @Component(

    dependencies = ApiComponent.class,
    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  209. @Component(

    dependencies = ApiComponent.class,
    modules = TwitterModule.class

    )

    public interface TwitterComponent {

    TwitterApplication app();

    }
    @User

    View Slide

  210. OkHttpClient
    TwitterApi
    NetworkModule

    View Slide

  211. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent

    View Slide

  212. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent

    View Slide

  213. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi

    View Slide

  214. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi

    View Slide

  215. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule

    View Slide

  216. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent

    View Slide

  217. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent

    View Slide

  218. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent
    TwitterApp

    View Slide

  219. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent
    TwitterApp

    View Slide

  220. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent
    TwitterApp

    View Slide

  221. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi

    View Slide

  222. OkHttpClient
    TwitterApi
    NetworkModule
    ApiComponent
    TwitterApi Tweeter
    Timeline
    TwitterModule
    TwitterComponent
    TwitterApp

    View Slide

  223. Under The Hood

    View Slide

  224. Under The Hood
    OkHttpClient
    TwitterApi
    NetworkModule#provideOkHttpClient
    NetworkModule#provideTwitterApi
    TwitterModule#provideTweeter
    TwitterModule#provideTimeline
    Tweeter
    Timeline

    View Slide

  225. @Module

    public class NetworkModule {

    @Provides @Singleton

    OkHttpClient provideOkHttpClient() {

    return new OkHttpClient();

    }


    @Provides @Singleton

    TwitterApi provideTwitterApi(OkHttpClient client) {

    return new TwitterApi(client);

    }

    }

    View Slide

  226. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory
    implements Factory {

    private final NetworkModule module;


    public NetworkModule_ProvideOkHttpClientFactory(NetworkModule module) { 

    this.module = module;

    }


    @Override

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }

    View Slide

  227. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory
    implements Factory {

    private final NetworkModule module;


    public NetworkModule_ProvideOkHttpClientFactory(NetworkModule module) { 

    this.module = module;

    }


    @Override

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }

    View Slide

  228. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory
    implements Factory {

    private final NetworkModule module;


    public NetworkModule_ProvideOkHttpClientFactory(NetworkModule module) { 

    this.module = module;

    }


    @Override

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }

    View Slide

  229. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory
    implements Factory {

    private final NetworkModule module;


    public NetworkModule_ProvideOkHttpClientFactory(NetworkModule module) {

    this.module = module;

    }


    @Override

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }

    View Slide

  230. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory {

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }
    public final class NetworkModule_ProvideTwitterApiFactory
    implements Factory {

    private final NetworkModule module;

    private final Provider clientProvider;


    public NetworkModule_ProvideTwitterApiFactory(
    NetworkModule module, Provider clientProvider) {

    this.module = module;

    this.clientProvider = clientProvider;

    }


    @Override

    public TwitterApi get() {

    return module.provideTwitterApi(clientProvider.get());

    }

    }

    View Slide

  231. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory {

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }
    public final class NetworkModule_ProvideTwitterApiFactory
    implements Factory {

    private final NetworkModule module;

    private final Provider clientProvider;


    public NetworkModule_ProvideTwitterApiFactory(
    NetworkModule module, Provider clientProvider) {

    this.module = module;

    this.clientProvider = clientProvider;

    }


    @Override

    public TwitterApi get() {

    return module.provideTwitterApi(clientProvider.get());

    }

    }

    View Slide

  232. public class NetworkModule {

    OkHttpClient provideOkHttpClient() {}
    TwitterApi provideTwitterApi(OkHttpClient) {}

    }
    public final class NetworkModule_ProvideOkHttpClientFactory {

    public OkHttpClient get() { 

    return module.provideOkHttpClient();

    }

    }
    public final class NetworkModule_ProvideTwitterApiFactory
    implements Factory {

    private final NetworkModule module;

    private final Provider clientProvider;


    public NetworkModule_ProvideTwitterApiFactory(
    NetworkModule module, Provider clientProvider) {

    this.module = module;

    this.clientProvider = clientProvider;

    }


    @Override

    public TwitterApi get() {

    return module.provideTwitterApi(clientProvider.get());

    }

    }

    View Slide

  233. @Singleton

    @Component(modules = NetworkModule.class)

    interface ApiComponent {

    TwitterApi api();

    }

    View Slide

  234. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    // ...

    public static final class Builder {

    private NetworkModule networkModule;


    public ApiComponent build() {

    if (networkModule == null) networkModule = new NetworkModule();

    return new Dagger_ApiComponent(this);

    }


    public Builder networkModule(NetworkModule networkModule) {

    if (networkModule == null) throw new NullPointerException();

    this.networkModule = networkModule;

    return this;

    }

    }

    }

    View Slide

  235. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    // ...

    public static final class Builder {

    private NetworkModule networkModule;


    public ApiComponent build() {

    if (networkModule == null) networkModule = new NetworkModule();

    return new Dagger_ApiComponent(this);

    }


    public Builder networkModule(NetworkModule networkModule) {

    if (networkModule == null) throw new NullPointerException();

    this.networkModule = networkModule;

    return this;

    }

    }

    }

    View Slide

  236. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {
















    }

    View Slide

  237. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  238. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  239. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  240. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  241. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  242. interface ApiComponent {

    TwitterApi api();

    }
    public final class Dagger_ApiComponent implements ApiComponent {

    private Provider provideOkHttpClientProvider;

    private Provider provideTwitterApiProvider;


    private Dagger_ApiComponent(Builder builder) {

    NetworkModule networkModule = builder.networkModule;

    provideOkHttpClientProvider = ScopedProvider.create(
    new NetworkModule_ProvideOkHttpClientFactory(networkModule));

    provideTwitterApiProvider = ScopedProvider.create(
    new NetworkModule_ProvideTwitterApiFactory(networkModule,
    provideOkHttpClientProvider));

    }


    @Override

    public TwitterApi api() {

    return provideTwitterApiProvider.get();

    }

    View Slide

  243. @Module

    public class TwitterModule {

    private final String user;


    public TwitterModule(String user) {

    this.user = user;

    }


    @Provides

    Tweeter provideTweeter(TwitterApi api) {

    return new Tweeter(api, user);

    }


    @Provides

    Timeline provideTimeline(TwitterApi api) {

    return new Timeline(api, user);

    }

    }
    @Component(

    dependencies = ApiComponent.class,

    modules = TwitterModule.class

    )

    interface TwitterComponent {

    TwitterApplication app();

    }

    View Slide

  244. public final class TwitterModule_ProvideTweeterFactory
    implements Factory {

    private final TwitterModule module;

    private final Provider apiProvider;


    public TwitterModule_ProvideTweeterFactory(
    TwitterModule module, Provider apiProvider) {

    this.module = module;

    this.apiProvider = apiProvider;

    }


    @Override

    public Tweeter get() {

    return module.provideTweeter(apiProvider.get());

    }

    }

    View Slide

  245. public final class TwitterModule_ProvideTimelineFactory
    implements Factory {

    private final TwitterModule module;

    private final Provider apiProvider;


    public TwitterModule_ProvideTimelineFactory(
    TwitterModule module, Provider apiProvider) {

    this.module = module;

    this.apiProvider = apiProvider;

    }


    @Override

    public Timeline get() {

    return module.provideTimeline(apiProvider.get());

    }

    }

    View Slide

  246. public final class TwitterApplication_Factory
    implements Factory {

    private final Provider tweeterProvider;

    private final Provider timelineProvider;


    public TwitterApplication_Factory(
    Provider tweeterProvider,
    Provider timelineProvider) {

    this.tweeterProvider = tweeterProvider;

    this.timelineProvider = timelineProvider;

    }


    @Override

    public TwitterApplication get() {

    return new TwitterApplication(tweeterProvider.get(),
    timelineProvider.get());

    }

    }

    View Slide

  247. public static final class Builder {

    private TwitterModule twitterModule;

    private ApiComponent apiComponent;


    public TwitterComponent build() {

    if (twitterModule == null) throw new IllegalStateException("...");

    if (apiComponent == null) throw new IllegalStateException("...");

    return new Dagger_TwitterComponent(this);

    }


    public Builder twitterModule(TwitterModule twitterModule) {

    if (twitterModule == null) throw new NullPointerException("twitterModule");

    this.twitterModule = twitterModule;

    return this;

    }


    public Builder apiComponent(ApiComponent apiComponent) {

    if (apiComponent == null) throw new NullPointerException("apiComponent");

    this.apiComponent = apiComponent;

    return this;

    }

    }

    View Slide

  248. public static final class Builder {

    private TwitterModule twitterModule;

    private ApiComponent apiComponent;


    public TwitterComponent build() {

    if (twitterModule == null) throw new IllegalStateException("...");

    if (apiComponent == null) throw new IllegalStateException("...");

    return new Dagger_TwitterComponent(this);

    }


    public Builder twitterModule(TwitterModule twitterModule) {

    if (twitterModule == null) throw new NullPointerException("twitterModule");

    this.twitterModule = twitterModule;

    return this;

    }


    public Builder apiComponent(ApiComponent apiComponent) {

    if (apiComponent == null) throw new NullPointerException("apiComponent");

    this.apiComponent = apiComponent;

    return this;

    }

    }

    View Slide

  249. public static final class Builder {

    private TwitterModule twitterModule;

    private ApiComponent apiComponent;


    public TwitterComponent build() {

    if (twitterModule == null) throw new IllegalStateException("...");

    if (apiComponent == null) throw new IllegalStateException("...");

    return new Dagger_TwitterComponent(this);

    }


    public Builder twitterModule(TwitterModule twitterModule) {

    if (twitterModule == null) throw new NullPointerException("twitterModule");

    this.twitterModule = twitterModule;

    return this;

    }


    public Builder apiComponent(ApiComponent apiComponent) {

    if (apiComponent == null) throw new NullPointerException("apiComponent");

    this.apiComponent = apiComponent;

    return this;

    }

    }

    View Slide

  250. public final class Dagger_TwitterComponent implements TwitterComponent {

    // ...


    private Dagger_TwitterComponent(Builder builder) {

    twitterModule = builder.twitterModule;

    apiComponent = builder.apiComponent;


    apiProvider = new Factory() {

    @Override public TwitterApi get() {

    return apiComponent.api();

    }

    };


    provideTweeterProvider =
    new TwitterModule_ProvideTweeterFactory(twitterModule, apiProvider);

    provideTimelineProvider =
    new TwitterModule_ProvideTimelineFactory(twitterModule, apiProvider);

    twitterApplicationProvider = new TwitterApplication_Factory(
    provideTweeterProvider, provideTimelineProvider);

    }

    View Slide

  251. public final class Dagger_TwitterComponent implements TwitterComponent {

    // ...


    private Dagger_TwitterComponent(Builder builder) {

    twitterModule = builder.twitterModule;

    apiComponent = builder.apiComponent;


    apiProvider = new Factory() {

    @Override public TwitterApi get() {

    return apiComponent.api();

    }

    };


    provideTweeterProvider =
    new TwitterModule_ProvideTweeterFactory(twitterModule, apiProvider);

    provideTimelineProvider =
    new TwitterModule_ProvideTimelineFactory(twitterModule, apiProvider);

    twitterApplicationProvider = new TwitterApplication_Factory(
    provideTweeterProvider, provideTimelineProvider);

    }

    View Slide

  252. Dagger_ApiComponent.create()

    View Slide

  253. Dagger_ApiComponent.create()
    new NetworkModule

    View Slide

  254. Dagger_ApiComponent.create()
    new NetworkModule
    new NetworkModule_ProvideOkHttpClientFactory
    new NetworkModule_ProvideTwitterApiFactory

    View Slide

  255. Dagger_ApiComponent.create()
    new NetworkModule
    new NetworkModule_ProvideOkHttpClientFactory
    new NetworkModule_ProvideTwitterApiFactory
    new TwitterModule("Jake Wharton")

    View Slide

  256. Dagger_ApiComponent.create()
    new NetworkModule
    new NetworkModule_ProvideOkHttpClientFactory
    new NetworkModule_ProvideTwitterApiFactory
    new TwitterModule("Jake Wharton")
    Dagger_TwitterComponent.builder()...build()

    View Slide

  257. Dagger_ApiComponent.create()
    new NetworkModule
    new NetworkModule_ProvideOkHttpClientFactory
    new NetworkModule_ProvideTwitterApiFactory
    new TwitterModule("Jake Wharton")
    Dagger_TwitterComponent.builder()...build()
    new Factory

    View Slide

  258. Dagger_ApiComponent.create()
    new NetworkModule
    new NetworkModule_ProvideOkHttpClientFactory
    new NetworkModule_ProvideTwitterApiFactory
    new TwitterModule("Jake Wharton")
    Dagger_TwitterComponent.builder()...build()
    new TwitterModule_ProvideTweeterFactory
    new TwitterModule_ProvideTimelineFactory
    new TwitterApplication_Factory
    new Factory

    View Slide

  259. twitterComponent.app()

    View Slide

  260. twitterComponent.app()
    twitterApplicationProvider.get()

    View Slide

  261. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    apiComponent.api()

    View Slide

  262. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    apiComponent.api()
    clientProvider.get()

    View Slide

  263. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    apiComponent.api()
    clientProvider.get()
    new OkHttpClient()

    View Slide

  264. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    new OkHttpClient()

    View Slide

  265. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    new OkHttpClient()
    new TwitterApi(..)

    View Slide

  266. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    new OkHttpClient()
    new TwitterApi(..)

    View Slide

  267. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)

    View Slide

  268. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    timelineProvider.get()
    apiProvider.get()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    apiComponent.api()
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)

    View Slide

  269. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    timelineProvider.get()
    apiProvider.get()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    apiComponent.api()
    provideTwitterApiProvider.get()
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)

    View Slide

  270. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    timelineProvider.get()
    apiProvider.get()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    apiComponent.api()
    provideTwitterApiProvider.get()
    twitterModule.provideTimeline(..)
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)

    View Slide

  271. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    timelineProvider.get()
    apiProvider.get()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    apiComponent.api()
    provideTwitterApiProvider.get()
    twitterModule.provideTimeline(..)
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)
    new Timeline(..)

    View Slide

  272. twitterComponent.app()
    twitterApplicationProvider.get()
    tweeterProvider.get()
    apiProvider.get()
    provideTwitterApiProvider.get()
    networkModule.provideOkHttpClient()
    twitterModule.provideTweeter(..)
    timelineProvider.get()
    apiProvider.get()
    networkModule.provideTwitterApi(..)
    apiComponent.api()
    clientProvider.get()
    apiComponent.api()
    provideTwitterApiProvider.get()
    twitterModule.provideTimeline(..)
    new TwitterApplication(..)
    new OkHttpClient()
    new TwitterApi(..)
    new Tweeter(..)
    new Timeline(..)

    View Slide

  273. Annotation Processing

    View Slide

  274. Annotation Processing
    bit.ly/apt-bd

    View Slide

  275. JSR 330

    View Slide

  276. public @interface Inject {}
    public @interface Qualifier {}
    public @interface Named {

    String value();

    }
    public interface Provider {

    T get();

    }
    public @interface Scope {}
    JSR 330
    public @interface Singleton {}

    View Slide

  277. Dagger 1

    View Slide

  278. public abstract class ObjectGraph {

    public static ObjectGraph create(Object... modules) {}

    public abstract ObjectGraph plus(Object... modules);

    public abstract void validate();

    public abstract void injectStatics();

    public abstract T get(Class type);

    public abstract T inject(T instance);

    }
    public interface Lazy {

    T get();

    }
    public @interface Module {

    Class>[] injects() default { };

    Class>[] staticInjections() default { };

    Class>[] includes() default { };

    Class> addsTo() default Void.class;

    boolean overrides() default false;

    boolean complete() default true;

    boolean library() default true;

    }
    public @interface Provides {

    enum Type { UNIQUE, SET }

    Type type() default Type.UNIQUE;

    }
    public interface MembersInjector {

    void injectMembers(T instance);

    }
    Dagger 1

    View Slide

  279. public abstract class ObjectGraph {

    public static ObjectGraph create(Object... modules) {}

    public abstract ObjectGraph plus(Object... modules);

    public abstract void validate();

    public abstract void injectStatics();

    public abstract T get(Class type);

    public abstract T inject(T instance);

    }
    public interface Lazy {

    T get();

    }
    public @interface Module {

    Class>[] injects() default { };

    Class>[] staticInjections() default { };

    Class>[] includes() default { };

    Class> addsTo() default Void.class;

    boolean overrides() default false;

    boolean complete() default true;

    boolean library() default true;

    }
    public @interface Provides {

    enum Type { UNIQUE, SET }

    Type type() default Type.UNIQUE;

    }
    public interface MembersInjector {

    void injectMembers(T instance);

    }
    Dagger 1
    public interface Lazy {

    T get();

    }
    public interface MembersInjector {

    void injectMembers(T instance);

    }
    public @interface Module {

    Class>[] injects() default { };

    Class>[] staticInjections() default { };

    Class>[] includes() default { };

    Class> addsTo() default Void.class;

    boolean overrides() default false;

    boolean complete() default true;

    boolean library() default true;

    }
    public abstract class ObjectGraph {

    public static ObjectGraph create(Object... modules) {}

    public abstract ObjectGraph plus(Object... modules);

    public abstract void validate();

    public abstract void injectStatics();

    public abstract T get(Class type);

    public abstract T inject(T instance);

    }

    View Slide

  280. Dagger 2

    View Slide

  281. public @interface Component {

    Class>[] modules() default {};

    Class>[] dependencies() default {};

    }
    public interface Lazy {

    T get();

    }
    public @interface Module {

    Class>[] includes() default { };

    }
    public @interface Provides {

    }
    public @interface MapKey {

    boolean unwrapValue();

    }
    Dagger 2

    View Slide

  282. public @interface Component {

    Class>[] modules() default {};

    Class>[] dependencies() default {};

    }
    public interface Lazy {

    T get();

    }
    public @interface Module {

    Class>[] includes() default { };

    }
    public @interface Provides {

    }
    public @interface MapKey {

    boolean unwrapValue();

    }
    Dagger 2
    public interface Lazy {

    T get();

    }
    public @interface MapKey {

    boolean unwrapValue();

    }

    View Slide

  283. More Concepts

    View Slide

  284. More Concepts
    • Set and map bindings.

    View Slide

  285. More Concepts
    • Set and map bindings.
    • Asynchronous producers.

    View Slide

  286. More Concepts
    • Set and map bindings.
    • Asynchronous producers.
    • Testing and module overrides.

    View Slide

  287. More Concepts
    • Set and map bindings.
    • Asynchronous producers.
    • Testing and module overrides.
    • AutoFactory for assisted injection.

    View Slide

  288. github.com/google/dagger

    View Slide

  289. Questions?

    View Slide

  290. Questions?
    jakewharton
    jakewharton
    jakewharton
    twitter.com/
    google.com/+
    .com

    View Slide

  291. View Slide