Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dagger 2
Search
José Caique Oliveira
February 16, 2017
Programming
1
140
Dagger 2
Slides da palestra sobre Dagger 2
José Caique Oliveira
February 16, 2017
Tweet
Share
More Decks by José Caique Oliveira
See All by José Caique Oliveira
Kotlin Flow
jcaiqueoliveira
0
120
Coroutines And Flow
jcaiqueoliveira
2
110
Testing your app
jcaiqueoliveira
0
300
Modularizando seu app
jcaiqueoliveira
0
73
Nova Api de Localização Android
jcaiqueoliveira
0
90
Arquitetura para android
jcaiqueoliveira
6
320
Kotlin por onde começar?
jcaiqueoliveira
1
94
Introdução ao Android
jcaiqueoliveira
1
85
Arquitetura para projetos Android
jcaiqueoliveira
1
230
Other Decks in Programming
See All in Programming
20251127_ぼっちのための懇親会対策会議
kokamoto01_metaps
2
440
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.1k
TestingOsaka6_Ozono
o3
0
170
SwiftUIで本格音ゲー実装してみた
hypebeans
0
420
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
250
俺流レスポンシブコーディング 2025
tak_dcxi
14
8.9k
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
AIの誤りが許されない業務システムにおいて“信頼されるAI” を目指す / building-trusted-ai-systems
yuya4
6
3.7k
AtCoder Conference 2025「LLM時代のAHC」
imjk
2
520
開発に寄りそう自動テストの実現
goyoki
2
1.2k
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
540
It's Worth the Effort
3n
187
29k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Side Projects
sachag
455
43k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
980
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
How to build a perfect <img>
jonoalderson
0
4.6k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
310
KATA
mclloyd
PRO
33
15k
The Invisible Side of Design
smashingmag
302
51k
Transcript
Dagger 2 Caique Oliveira
Introdução 1
Introdução ◦ Inversão de controle ◦ Injeção de dependência
O que é ◦ Framework para injeção de dependência ◦
Fork do Dagger 1 ◦ JSR 330
Alguns ganhos ◦ Evita boilerplate ◦ Organização das dependências ◦
Fácil criação de testes
Vamos ao Dagger 2 2
Annotations ◦ Module ◦ Provides ◦ Component ◦ SubComponent ◦
Scope ◦ Inject ◦ Reusable ◦ Singleton
Module Identifica uma classe provedora de dependências @Module public class
LoginModule
Provides Identifica que um método é um provedor de dependência
@Module public class LoginModule { @Provides AuthenticationLayer providesAuthenticationLayer(Context context) { return new AuthenticationLayer(context); } }
Quem prover a dependência de um provider ?
Outro “provedor” @Module public class ApplicationModule { private Application application;
public ApplicationModule(Application application) { this.application = application; } @Provides Application providesApplication() { return application; } @Provides Context providesContext(Application application) { return application.getBaseContext(); } }
Component Define quais módulos podem ser utilizados e quem pode
utilizar tais módulos @Component(modules = { ApplicationModule.class}) public interface MainComponent { void inject(LoginActivity activity); }
SubComponent Repartição do grafo de dependências @ActivityScope @Subcomponent(modules = {LoginModule.class})
public interface ActivityComponent { void inject(LoginActivity activity); } @Component(modules = {ApplicationModule.class}) public interface MainComponent { ActivityComponent activityComponent(); FragmentComponent fragmentComponent(); }
Scopo Altera o ciclo de vida de um objeto @Scope
@Retention(RetentionPolicy.RUNTIME) public @interface ActivityScope { }
Reusable Indica que um dado objeto pode ser reutilizado @Module
public class ManagerModule { @Reusable @Provides DataController providesDataController(Context context) { return new DataController(context); } @Provides @Reusable AuthenticationLayer providesAuthenticationLayer(Context context, AuthenticationClient authenticationClient) { return new AuthenticationLayer(context,authenticationClient); } }
Singleton Indica que se precisa da mesma instância do objeto
@Module public class ManagerModule { @Reusable @Singleton DataController providesDataController(Context context) { return new DataController(context); } @Provides @Singleton AuthenticationLayer providesAuthenticationLayer(Context context, AuthenticationClient authenticationClient) { return new AuthenticationLayer(context,authenticationClient); } }
Inject Indica que é necessário injetar uma depêndencia public class
LoginActivity extends BaseActivity { @Inject public LoginPresenter loginPresenter; @Override public void onStart() { super.onStart(); ((Application) getApplication()).getMainComponent().activityComponent().inject(this); loginPresenter.bindView(this, this); } }
Inject Indica que é necessário injetar uma depêndencia public class
Application extends CoreApplication { private MainComponent mainComponent; @Override public void onCreate() { super.onCreate(); initDagger(); } private void initDagger() { mainComponent = DaggerMainComponent.builder().applicationModule(new ApplicationModule(this)).build(); } public MainComponent getMainComponent() { return mainComponent; } }
Refatorando para o Dagger 2 3
Refatorando - LoginPresenterImpl class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener { private
Context context; private LoginView loginView; private LoginInteractor loginInteractor; LoginPresenterImpl(Context context, LoginView loginView) { this.context = context; this.loginView = loginView; this.loginInteractor = new LoginInteractorImpl(context); } ... }
Refatorando - LoginPresenterImpl class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener { private
Context context; private LoginView loginView; private LoginInteractor loginInteractor; @Inject LoginPresenterImpl(LoginInteractor loginInteractor) { this.loginInteractor = loginInteractor; } @Override public void bindView(Context context, LoginView view) { this.context = context; this.loginView = view; } }
Refatorando - LoginInteractorImpl class LoginInteractorImpl implements LoginInteractor { private Context
context; LoginInteractorImpl(Context context) { this.context = context; } @Override public void authenticate(String email, String password, OnLoginFinishedListener listener) { //... new AuthenticationLayer(context).postAuthenticate(new AuthenticateRequest(email, password)); } @Override public void busAuthenticate(AuthenticateResponse authenticateResponse, OnLoginFinishedListener listener) { if (authenticateResponse.isSuccess()) { saveInformations(authenticateResponse); new UserManager().deleteAll(); new UserLayer(context).getUsers(); }else{ //... } } private void saveInformations(AuthenticateResponse authenticateResponse) { DataController dataController = new DataController(context); dataController.writeData(Constants.SharedPreferences.CONTROLLER_EMAIL, authenticateResponse.getEmail()); } }
Refatorando - LoginInteractorImpl class LoginInteractorImpl implements LoginInteractor { private UserLayer
userLayer; private Context context; private AuthenticationLayer authenticationLayer; private DataController dataController; private UserManager userManager; @Inject LoginInteractorImpl(Context context, AuthenticationLayer authenticationLayer, DataController dataController, UserManager userManager, UserLayer userLayer) { this.authenticationLayer = authenticationLayer; this.context = context; this.dataController = dataController; this.userManager = userManager; this.userLayer = userLayer; } … }
LoginModule @Module public class LoginModule { @Provides AuthenticationLayer providesAuthenticationLayer(Context context)
{ return new AuthenticationLayer(context); } @Provides @Reusable LoginInteractor providesLoginInteractor(Context context, AuthenticationLayer layer, DataController dataController, UserManager userManager, UserLayer userLayer) { return new LoginInteractorImpl(context, layer, dataController, userManager, userLayer); } @Provides @Reusable LoginPresenter providesLoginPresenter(LoginInteractor loginInteractor) { return new LoginPresenterImpl(loginInteractor); }
LoginModule @Module public class LoginModule { @Provides @Reusable DataController providesDataController(Context
context) { return new DataController(context); } @Provides @Reusable UserLayer providesUserLayer(Context context) { return new UserLayer(context); } @Provides @Reusable UserManager providesUserManager() { return new UserManager(); } }
Grafo de dependências Presenter Interactor UserManager AuthenticationLayer UserLayer DataController
Obrigado! Dúvidas?
Olá! Contate-me https://github.com/jcaiqueoliveira https://www.linkedin.com/in/caique-oliveira-43806895/
[email protected]