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

Dagger2 has been released!

Dagger2 has been released!

Migrated story from Dagger1 to Dagger2 in Qiitanium App

Masaki Ogata

April 15, 2015
Tweet

More Decks by Masaki Ogata

Other Decks in Programming

Transcript

  1. Dagger 2.0 has been
    released!
    at potatotips #16

    View Slide

  2. About me
    Job $> Android Engineer v0.1
    GitHub $> https://github.com/ogaclejapan
    Company $> CyberAgent, Inc.
    Name $> Masaki Ogata (@ogaclejapan)

    View Slide

  3. Qiitanium

    View Slide

  4. http://github.com/ogaclejapan/qiitanium
    ɾRxJava
    ɾClean Architecture + MVVMʢࣗশʣ
    ɾDagger
    ɾOkHttp

    View Slide

  5. http://github.com/ogaclejapan/qiitanium
    ɾ
    ɾ
    ɾDagger
    ɾ

    View Slide

  6. http://github.com/ogaclejapan/qiitanium
    ɾ
    ɾ
    ɾDagger 1.x
    ɾ
    Dagger 2.0
    Migrated!

    View Slide

  7. About Dagger

    View Slide

  8. About Dagger
    Let me ask Wasabeef !!
    https://speakerdeck.com/wasabeef/dagger
    at potatotips #9

    View Slide

  9. Dagger2.0 Overview

    View Slide

  10. 100% Proguard friendly
    @Generated("dagger.internal.codegen.ComponentProcessor")
    public final class AppModule_ProvideApplicationFactory
    implements Factory {
    private final AppModule module;
    @Override
    public Application get() {
    Application provided = module.provideApplication();
    if (provided == null) {
    throw new NullPointerException("Cannot return null
    from a [email protected] @Provides method");
    }
    return provided;
    }
    }

    View Slide

  11. 100% Proguard friendly
    ɾ θϩϦϑϨΫγϣϯ
    ɾ ࣗಈੜ੒ίʔυ΋σόοάτϨʔε͕Մೳ
    ɾύϑΥʔϚϯε͕޲্

    View Slide

  12. @Component
    Dagger1:
    FeatureModule
    ObjectGraph
    SubModule1
    SubModule2
    SubModule3
    load
    Includes
    AppModule
    plus
    SubGraph

    View Slide

  13. @Component
    Dagger1:
    @Module(includes={Module1.class, …}, injects={…})
    public class AppModule {
    @Provided
    public Hoge provideHoge() {
    return new Hoge();
    }
    }
    ObjectGraph graph = ObjectGraph.create(new Object[] {
    new AppModule()});
    graph.inject(this);
    ObjectGraph sub = graph.plus(new FeatureModule());

    View Slide

  14. @Component
    Dagger2:
    AppComponent
    FeatureComponent
    Module1
    Module2
    Module3
    modules
    FeatureModule
    AppModule
    modules
    dependencies

    View Slide

  15. @Component
    Dagger2:
    @Component(modules={ AppModule.class, …})
    public interface AppComponent {
    public void inject(Application app);
    }
    @Generated(“…”)
    public class DaggerAppComponent {
    //…
    }
    Annotation

    Processor
    AppComponent component = DaggerAppComponent.builder()
    .appModule(…).build();
    component.inject(this);

    View Slide

  16. Migrate Dagger 1.x to 2.0

    (ͦͷұ)

    View Slide

  17. Scope
    @Module
    public class Module1 {
    @Singleton
    @Provided
    public Hoge provideHoge() {
    return new Hoge();
    }
    }
    @Component(modules = { Module1.class })
    public interface AppComponent {
    //…
    }

    View Slide

  18. Error: AppComponent (unscoped) may not reference
    scoped bindings:
    @Singleton @Provides Hoge
    Compile Error…

    View Slide

  19. Fix
    @Module
    public class
    @Provided
    public
    return new
    }
    }
    @Component(modules = {
    public interface AppComponent {
    //…
    }
    @Singleton

    View Slide

  20. Custom Scope
    Component୯ҐͰΠϯελϯεΛ؅ཧ͍ͯ͠Δ
    @Generated(“…”)
    public final class DaggerAppComponent {
    //…
    private void initialize(final Builder builder) {
    this.…Provider = ScopedProvider.create(…);
    }
    //…
    }
    ScopedProviderͰSingleton੍ޚ͕͞Ε͍ͯΔ

    View Slide

  21. Custom Scope
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface PerActivity {
    }
    @Module(modules={…})
    public class ActivityModule {
    @PerActivity
    @Provided
    public Hoge provideHoge() {
    return new Hoge();
    }
    }
    Dagger2Ͱ͸ScopeΛಠࣗʹఆٛͯ͠࢖͏

    View Slide

  22. Migrate Dagger 1.x to 2.0
    (ͦͷ್)

    View Slide

  23. Override Module
    Dagger1: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule {
    @Singleton
    @Provided
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    Object[] list() {
    return ObjectGraph.create(new Object[] {
    new AppModule(),
    new DebugAppModule });
    }
    }

    View Slide

  24. Override Module
    Dagger2: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule {
    @Singleton
    @Provided
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    Object[] list() {
    return ObjectGraph.create(new Object[] {
    new AppModule(),
    new DebugAppModule });
    }
    }

    View Slide

  25. Override Module
    Dagger2: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule extends AppModule {
    @Singleton
    @Provided
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    Object[] list() {
    return ObjectGraph.create(new Object[] {
    new AppModule(),
    new DebugAppModule });
    }
    }

    View Slide

  26. Override Module
    Dagger2: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule extends AppModule {
    @Singleton
    @Provided
    @Override
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    Object[] list() {
    return ObjectGraph.create(new Object[] {
    new AppModule(),
    new DebugAppModule });
    }
    }

    View Slide

  27. Override Module
    Dagger2: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule extends AppModule {
    @Singleton
    @Provided
    @Override
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    Object[] list() {
    return ObjectGraph.create(new Object[] {
    new AppModule(),
    new DebugAppModule });
    }
    }

    View Slide

  28. Override Module
    Dagger2: src/debug/java/..
    @Module(addsTo=AppModule.class, override=true, …)
    public class DebugAppModule extends AppModule {
    @Singleton
    @Provided
    @Override
    public Hoge provideHoge() {
    return new DebugHoge();
    }
    }
    class Modules {
    AppModule appModule() {
    return new DebugAppModule();
    }
    }

    View Slide

  29. Override Module
    Dagger2: src/main/java/..
    public class MyApplication extends Application {
    @Inject Hoge mHoge;
    @Override
    public void onCreate() {
    AppComponent component = DaggerAppComponent.builder()
    .appModule(Modules.appModule())
    .build();
    component.inject(this);
    System.out.println(mHoge instanceof DebugHoge); //true
    }
    }

    View Slide

  30. Let’s enjoy Dagger2 !!

    View Slide

  31. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    m(_ _)m

    View Slide