Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Dagger 2 : Back to basics
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Jeremie Martinez
November 10, 2015
Programming
1.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dagger 2 : Back to basics
Slides de mon talk sur Dagger 2 à la Droidcon Paris.
Jeremie Martinez
November 10, 2015
More Decks by Jeremie Martinez
See All by Jeremie Martinez
Gradle, je t'aime, moi non plus…
jeremiemartinez
0
370
The evolution of Android notification
jeremiemartinez
5
5.3k
Tips and tricks du rebranding de l'app Captain Train
jeremiemartinez
1
390
DevOps sur Android : from one git push to a Play Store release
jeremiemartinez
17
2.8k
See the Truth
jeremiemartinez
0
360
DevOps sur Android : D'un git push à une release Play Store
jeremiemartinez
5
610
La stack réseau Android, disponible également pour vos backs
jeremiemartinez
0
560
Other Decks in Programming
See All in Programming
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
520
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
150
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
1.1k
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
280
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
190
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
440
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
770
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
180
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
22k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
490
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
A Modern Web Designer's Workflow
chriscoyier
699
190k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Faster Mobile Websites
deanohume
310
32k
Building Adaptive Systems
keathley
44
3.2k
Tell your own story through comics
letsgokoyo
1
1.1k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
420
Mobile First: as difficult as doing things right
swwweet
225
10k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
400
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