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

Introduction to Dagger 2

Introduction to Dagger 2

An introduction covered with example codes to demonstrate the need and how to use in the simplest way possible the dependency injection framework "Dagger".

Marcello Galhardo

January 24, 2017
Tweet

More Decks by Marcello Galhardo

Other Decks in Programming

Transcript

  1. Introduction to Dagger 2
    Marcello Galhardo

    View Slide

  2. @marcellogalhardo
    @marcellogalhardo
    @MarcelloGalhard
    [email protected]
    /marcellogalhardo
    Android Dev BR
    slack.androiddevbr.org

    View Slide

  3. Do you know...
    ...inversion of control?

    View Slide

  4. Do you know...
    ...inversion of control?
    ...Dagger?

    View Slide

  5. Why should I use
    Dependency Injection?

    View Slide

  6. Easy reuse of
    components

    View Slide

  7. Safer and
    easier
    refactoring

    View Slide

  8. Easier testing

    View Slide

  9. Activity

    View Slide

  10. Presenter
    Activity

    View Slide

  11. Presenter
    Repository
    Activity

    View Slide

  12. Presenter
    Repository
    Activity
    Api

    View Slide

  13. Presenter
    Repository
    Activity
    Cache
    Api

    View Slide

  14. public class Activity extends AppCompatActivity {
    private Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    presenter = new Presenter();
    }
    }
    public class Presenter {
    private Repository repository;
    public Presenter() {
    repository = new Repository();
    }
    }
    Activity.java / Presenter.java

    View Slide

  15. public class Activity extends AppCompatActivity {
    private Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    presenter = new Presenter();
    }
    }
    public class Presenter {
    private Repository repository;
    public Presenter() {
    repository = new Repository();
    }
    }
    Activity.java / Presenter.java

    View Slide

  16. public class Activity extends AppCompatActivity {
    private Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Api api = new Api();
    Cache cache = new Cache();
    Repository repository = new Repository(api, cache);
    presenter = new Presenter(repository);
    }
    }
    Activity.java

    View Slide

  17. public class Activity extends AppCompatActivity {
    private Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Api api = new Api();
    Cache cache = new Cache();
    Repository repository = new Repository(api, cache);
    presenter = new Presenter(repository);
    }
    }
    Activity.java

    View Slide

  18. ● Too much boilerplate
    code;
    Problems!

    View Slide

  19. ● Too much boilerplate
    code;
    ● Hard to maintain the
    dependency graph.
    Problems!

    View Slide

  20. Let's talk about Dagger

    View Slide

  21. Dagger 2
    ● No Reflection;

    View Slide

  22. Dagger 2
    ● No Reflection;
    ● Code generated at build
    time;

    View Slide

  23. Dagger 2
    ● No Reflection;
    ● Code generated at build
    time;
    ● Easy to debug;

    View Slide

  24. Dagger 2
    ● No Reflection;
    ● Code generated at build
    time;
    ● Easy to debug;
    ● Easy to maintain the
    dependency graph.

    View Slide

  25. app/build.gradle
    dependencies {
    annotationProcessor "com.google.dagger:dagger-compiler:2.8"
    compile "com.google.dagger:dagger:2.8"
    provided "org.glassfish:javax.annotation:2.8"
    }

    View Slide

  26. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  27. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  28. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  29. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  30. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  31. @Singleton
    @Component(modules = {
    MainModule.class,
    ...})
    public interface MainComponent {
    void inject(Activity activity);
    }
    MainComponent.java

    View Slide

  32. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  33. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  34. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  35. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  36. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  37. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  38. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  39. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  40. MainModule.java
    @Module public class MainModule {
    private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024;
    private static final int TIMEOUT = 20;
    @Provides public Presenter providesPresenter(Repository repository) {
    return new Presenter(repository);
    }
    @Provides @Reusable public Repository repository(Cache cache, Api api) {
    return new Repository(cache, api);
    }
    @Provides @Singleton public Cache providesCache() {
    return new Cache(CACHE_SIZE_10_MB);
    }
    @Provides @Reusable public Api providesApi() {
    return new Api(TIMEOUT);
    }
    }

    View Slide

  41. MainApplication.java
    public class MainApplication extends Application {
    private MainComponent component;
    @Override public void onCreate() {
    super.onCreate();
    component = DaggerMainComponent.builder().build();
    }
    public MainComponent getComponent() {
    return component;
    }
    }

    View Slide

  42. MainApplication.java
    public class MainApplication extends Application {
    private MainComponent component;
    @Override public void onCreate() {
    super.onCreate();
    component = DaggerMainComponent.builder().build();
    }
    public MainComponent getComponent() {
    return component;
    }
    }

    View Slide

  43. MainApplication.java
    public class MainApplication extends Application {
    private MainComponent component;
    @Override public void onCreate() {
    super.onCreate();
    component = DaggerMainComponent.builder().build();
    }
    public MainComponent getComponent() {
    return component;
    }
    }

    View Slide

  44. MainApplication.java
    public class MainApplication extends Application {
    private MainComponent component;
    @Override public void onCreate() {
    super.onCreate();
    component = DaggerMainComponent.builder().build();
    }
    public MainComponent getComponent() {
    return component;
    }
    }

    View Slide

  45. Activity

    View Slide

  46. Application
    Activity

    View Slide

  47. Application
    Component
    Activity

    View Slide

  48. Application
    Component
    Activity
    MainModule

    View Slide

  49. Application
    Component
    Activity
    Modules...
    MainModule

    View Slide

  50. Activity.java
    public class Activity extends AppCompatActivity {
    @Inject
    Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MainApplication application = getMainApplication();
    MainComponent component = application.getComponent();
    component.inject(this);
    }
    }

    View Slide

  51. Activity.java
    public class Activity extends AppCompatActivity {
    @Inject
    Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MainApplication application = getMainApplication();
    MainComponent component = application.getComponent();
    component.inject(this);
    }
    }

    View Slide

  52. Activity.java
    public class Activity extends AppCompatActivity {
    @Inject
    Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MainApplication application = getMainApplication();
    MainComponent component = application.getComponent();
    component.inject(this);
    }
    }

    View Slide

  53. Activity.java
    public class Activity extends AppCompatActivity {
    @Inject
    Presenter presenter;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MainApplication application = getMainApplication();
    MainComponent component = application.getComponent();
    component.inject(this);
    }
    }

    View Slide

  54. Repository
    Cache
    Api

    View Slide

  55. Repository
    MockCache
    MockApi
    Api Cache

    View Slide

  56. Examples

    View Slide

  57. github.com/marcellogalhardo/events

    View Slide

  58. github.com/marcellogalhardo/locations

    View Slide

  59. Questions?

    View Slide

  60. www.concretesolutions.com.br
    Rio de Janeiro – Rua São José, 90 – cj. 2121
    Centro – (21) 2240-2030
    São Paulo - Av. Nações Unidas, 11.541
    3º andar - Brooklin - (11) 4119-0449
    We help companies create
    successful digital products

    View Slide