Slide 1

Slide 1 text

Dagger 2.0 has been released! at potatotips #16

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Qiitanium

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

About Dagger

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Dagger2.0 Overview

Slide 10

Slide 10 text

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 non-@Nullable @Provides method"); } return provided; } }

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

@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());

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

@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);

Slide 16

Slide 16 text

Migrate Dagger 1.x to 2.0
 (ͦͷұ)

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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 }); } }

Slide 24

Slide 24 text

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 }); } }

Slide 25

Slide 25 text

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 }); } }

Slide 26

Slide 26 text

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 }); } }

Slide 27

Slide 27 text

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 }); } }

Slide 28

Slide 28 text

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(); } }

Slide 29

Slide 29 text

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 } }

Slide 30

Slide 30 text

Let’s enjoy Dagger2 !!

Slide 31

Slide 31 text

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