Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dagger 2 : Back to basics
Search
Jeremie Martinez
November 10, 2015
Programming
2
1.1k
Dagger 2 : Back to basics
Slides de mon talk sur Dagger 2 à la Droidcon Paris.
Jeremie Martinez
November 10, 2015
Tweet
Share
More Decks by Jeremie Martinez
See All by Jeremie Martinez
Gradle, je t'aime, moi non plus…
jeremiemartinez
0
340
The evolution of Android notification
jeremiemartinez
5
5k
Tips and tricks du rebranding de l'app Captain Train
jeremiemartinez
1
350
DevOps sur Android : from one git push to a Play Store release
jeremiemartinez
17
2.7k
See the Truth
jeremiemartinez
0
320
DevOps sur Android : D'un git push à une release Play Store
jeremiemartinez
5
590
La stack réseau Android, disponible également pour vos backs
jeremiemartinez
0
520
Other Decks in Programming
See All in Programming
ECS初心者の仲間 – TUIツール「e1s」の紹介
keidarcy
0
110
コンテキストエンジニアリング Cursor編
kinopeee
1
730
物語を動かす行動"量" #エンジニアニメ
konifar
14
5.6k
AI OCR API on Lambdaを Datadogで可視化してみた
nealle
0
210
testingを眺める
matumoto
1
120
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
17
9.1k
Jakarta EE Core Profile and Helidon - Speed, Simplicity, and AI Integration
ivargrimstad
0
240
Flutter로 Gemini와 MCP를 활용한 Agentic App 만들기 - 박제창 2025 I/O Extended Seoul
itsmedreamwalker
0
160
CSC305 Summer Lecture 12
javiergs
PRO
0
130
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
3
1.4k
サーバーサイドのビルド時間87倍高速化
plaidtech
PRO
0
660
Kiroの仕様駆動開発から見えてきたAIコーディングとの正しい付き合い方
clshinji
1
180
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Why Our Code Smells
bkeepers
PRO
339
57k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Balancing Empowerment & Direction
lara
2
600
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Facilitating Awesome Meetings
lara
55
6.5k
Being A Developer After 40
akosma
90
590k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
For a Future-Friendly Web
brad_frost
179
9.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Transcript
Dagger 2 Back to basics @JeremMartinez 1 jeremie-martinez.com
Inversion of Control “Don’t call us, we’ll call you…” 2
Injection de dépendances JSR-330 Bob Lee Créateur de Guice Rod
Johnson Créateur de Spring 3
Pourquoi ? 4 Single Responsibility principle Meilleur découpage Facilement testable
Meilleur maintenabilité Qualité de code
Un peu d’Historique “Once upon a time…” 5
Problèmes 6
Problèmes BOILERPLATE 7 du code
Problèmes LENT à l’initialisation et à l’injection 8
Problèmes LOURD en mémoire et dans l’APK 9
Problèmes FAIL au runtime 10
Besoins Analyse statique Pas d’introspection Fail fast Aucun impact 11
Dagger by Square 12
Dagger 1 Créé en 2012 par Jesse Wilson (Guice) Encadré
par Bob Lee (Guice, JSR330, Guava, CTO Square) Ouvert en mai 2013 Dernière version en Juillet 2014 (1.2.2) 13
Bilan Rapide et facile JSR330 Compatible Utilisable sur Android Annotation
Processing Ouvert à la communauté Java Introspection sur les classes Pas totalement au compile time Analyse pas totalement statique Proguard 14
Dagger 2 by Google 15
Dagger 2 Repris par la Java Core Librairies Team Assisté
par Square Release en avril 2015 Résout les problématiques restantes de la version 1 16
API 17
API Fournir les dépendances : @Provides et @Module Demander des
dépendances : @Inject Lier les modules et les injections : @Component Implémenter le pattern singleton : @Singleton 18
3 formes d’injection 19
3 formes d’injection Par constructeur 20
Par constructeur public class ApiManager { private final Api api;
@Inject public ApiManager(Api api) { this.api = api; } … } 21
3 formes d’injection Par constructeur Par field 22
Par field public class ApiManager { @Inject Api api; …
} 23
3 formes d’injection Par setter Par constructeur Par field 24
Par field public class ApiManager { private Api api; @Inject
public void setApi(Api api) { … } … } 25
Par field public class ApiManager { private Api api; @Inject
public void setApi(Api api) { … } … } Not supported 26
Live coding 27
SpeakersActivity SlotsActivity 28
SpeakersActivity SlotsActivity SpeakerManager SlotManager 29
SpeakersActivity SlotsActivity SpeakerManager SlotManager 30
SpeakersActivity SlotsActivity SpeakerManager SlotManager ApiManager 31
SpeakersActivity SlotsActivity SpeakerManager SlotManager ApiManager HttpClient Converter 32
SpeakersActivity SlotsActivity SpeakerManager SlotManager ApiManager HttpClient EventBus Converter 33
SpeakersActivity SlotsActivity SpeakerManager SlotManager ApiManager HttpClient EventBus Converter 34
Pour aller plus loin… 35
Scope “(sous-)Graphe local à durée de vie limitée” 36
Scope - Exemple Application Scope UserScope UserScope Activity Scope ActivityScope
ActivityScope Activity Scope ActivityScope ActivityScope DetailsActivity ListActivity LoginActivity LoginActivity ListActivity DetailsActivity Connexion Changement 37 Deconnexion
Scope “(sous-)Graphe local à durée de vie limitée” Par exemple
: • Singleton • PerActivity •PerUser • PerRequest 38
Scope - API @Scope @Retention(RetentionPolicy.RUNTIME) public @interface UserScope{} Ne pas
oublier d’annoter le composant ! 39
Scope - Conclusion Clarté du graphe Mémoire Meilleure modélisation 40
Lazy @Inject Lazy<ApiManager> lazyApi; ApiManager api = lazyApi.get(); Déplace l’initialisation
de l’objet à sa première utilisation 41
Named Injection par chaine de caractères Un seul qualifier par
dépendance @Inject @Named("userPrefs") SharedPreferences userPrefs; @Inject @Named("appPrefs") SharedPreferences appPrefs; @Provides @Named("userPrefs") public SharedPreferences providesUserPrefs() @Provides @Named("appPrefs") public SharedPreferences providesAppPrefs() 42
Tests “Tester c’est douter…” 43
Tests - Dagger INUTILE “Si ça compile, ça marche !”
44
Tests - Unitaires public class ApiManager { private final EventBus
bus; private final Api api; @Inject public ApiManager(EventBus bus, Api api) { … } … } 45
Tests - Unitaires @RunWith(MockitoJUnitRunner.class) public class ApiManagerTest { @Mock EventBus
bus; @Mock Api api; @InjectMocks ApiManager apiManager; @Test public should_call_backend() { … } … } 46
Tests - Fonctionnels Pas de bonne solution 47
Tests - Fonctionnels Build variant sur l’Android Gradle Plugin Mock
des modules Dupliquer les configurations 48
Conclusion 49
Merci ! @JeremMartinez 50