Proces budowania większości aplikacji niezależnie od środowiska polega na tworzeniu różnego typu obiektów, które często wymagają innych zależności i nierzadko mogą być współdzielone. Ręczna inicjalizacja wszystkich zależności bywa kosztowna, czasochłonna oraz może zwiększać nadmiarowość powtarzającego się kodu (boilerplate). Wzorzec Wstrzykiwanie zależności (Dependency Injection) jest realizacją paradygmatu Odwrócenia sterowania (Inversion of Control) i przejmuje odpowiedzialność inicjalizowania obiektów poprzez wstrzykiwanie oczekiwanych zależności w odpowiednie miejsca. Na podstawie zdefiniowanych komponentów i modułów Dagger dokonuje analizy zależności oraz generuje kod odpowiedzalny za wiązanie obiektów, a jego użycie opiera się wyłącznie na wykorzystaniu adnotacji i kontroli kompilacji w celu analizy i weryfikacji zależności. Dzięki temu proces testowania, refaktoryzacji i dostęp do współużytkowanych instancji jest uproszczony.
Wstrzykiwanie
Obiekt oznaczony adnotacją @Inject oczekuje inicjalizacji poprzez wstrzyknięcie zależności z poziomu komponentu. Jeśli kilka instancji tego samego typu ma zostać wstrzyknięte wówczas należy dokonać rozróżnienia za pomocą adnotacji @Named o wartości zgodnej z deklaracją w module. Istnieje także możliwość definicji własnego kwalifikatora przy użyciu adnotacji @Qualifier w definicji adnotacji.
Moduł
Klasa oznaczona jako @Module staje się modułem, którego zadaniem jest deklaracja i konfiguracja dostarczanych przez niego zależności co odbywa się przy użyciu metod oznaczonych adnotacją @Provides. To jaka zależność ma zostać wstrzyknięta rozpoznawane jest przez komponent na podstawie zgodności typów i kwalifikatora dlatego nazwa metody nie ma znaczenia. Jednak dobrą praktyką jest przyjęcie stałego schematu nazewnictwa. Dodatkowo adnotacja @Singleton zapewnia, że instancja obiektu będzie singletonem w obrębie zakresu.
Komponent
Komponent buduje zależności zadeklarowane w modułach oraz umożliwia ich dostarczenie przez zainteresowane klasy. Aby stworzyć komponent należy oznaczyć klasę adnotacją @Component, wskazać źródła zależności w postaci listy modułów oraz stworzyć metodę przyjmującą jako argument klasę do której mogą zostać wstrzyknięte zależności. Zachodzi tutaj silne typowanie w związku z czym nie możliwe jest deklaracja klasy bazowej jako parametu. Każda aplikacja wymaga posiadania komponentu bazowego, który najlepiej stworzyć w głównej klasie aplikacji. Jeśli któryś z modułów komponentu posiada konstruktor argumentowy wówczas inicjalizacja komponentu zachodzi przy użyciu budowniczego builder, a w przeciwnym wypadku wystarczy wywołanie metody create.
Wstrzykiwanie zależności oznaczonych jako @Inject w klasie docelowej zachodzi poprzez wywołanie metody komponentu (jeśli został on wcześniej zainicjalizowany).
Zakres
Komponenty i moduły w Dagger działają w podanym zakresie (domyślnie w obszarze całej aplikacji) w obrębie którego dostępne są zależności. Zakres jest swego rodzaju etykietą, któego rolą jest informowanie programisty o przeznaczeniu i cyklu życia danej zależności czy komponentu oraz kompilatora w celu weryfikacji zgodności. Aby stworzyć zakres należy zdefiniować adnotację oznaczoną jako @Scope.
Komponent zależny
Rozszerzenie funckjonalności komponentu może zostać zrealizowane za pomocą wskazania zależności w postaci komponentu bazowego w komponencie pochodnym. Innymi słowy komponent rozszerzający jest swego rodzaju delegatem i poza modułami przyjmuje także zależność komponentu, który jest dla niego dostawcą. Komponent bazowy dostarcza API w postaci metod zwracających dany oczekiwany typ zależności (podobnie jak robi to moduł).
Podkomponent
Rozwinięcie grafu drzewa może odbywać się przy użyciu podkomponentów, które rozszerzają zależności komponentu bazowego co sprawia, że komponenty te są ze sobą powiązane. Aby stworzyć komponent, który będzie podkomponentem należy oznaczyć go adnotacją @Subcomponent, dodać fabrykę w komponencie bazowym zwracającą podkomponent oraz dokonać inicjalizacji we właściwym zakresie.
Fabryka
Jedną z trudności pisania aplikacji z użyciem Dagger w środowisku Android jest to, że klasy komponentów (Activity, Fragment, Service itp) są inicjalizowane przez system operacyjny co wymusza wstrzykiwanie w metodach cyklu życia. Aby zredukować powtarzający się w ten sposób kod odpowiedzialny za pobieranie komponentu i wstrzykiwanie instancji pól oraz wyeliminować problem łamania zasady znajomości sposobu działania konterera zależności przez klasę wywołującą można posłużyć się klasami z pakietu dagger.android. W tym celu należy dostarczyć do podstawowego komponentu aplikacji moduł zawierający fabrykę abstrakcyjną wiążącą podkomponenty z klasami wywołań i wstrzyknąć zbudowane zależności w głównej klasie aplikacji.
Jeśli podkomponenty i ich klasy budowniczych nie wymagają dodatkowej konfiguracji wówczas wykorzystanie adnotacji @ContributesAndroidInjector w metodach modułu zwracających klasę wywołującą spowoduje automatyczne ich utworzenie.
Ponadto Dagger dostarcza rozszerzone klasy komponentów DaggerApplication, DaggerActivity, DaggerFragment, DaggerService, DaggerBroadcastReceiver, DaggerContentProvider, które jeszcze bardziej upraszczają tworzenie aplikacji.