Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
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
91
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
Cap'n Webについて
yusukebe
0
150
AIコーディングエージェント(skywork)
kondai24
0
200
Deno Tunnel を使ってみた話
kamekyame
0
230
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
130
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
470
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
190
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
160
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
shogo4131
8
2.5k
GISエンジニアから見たLINKSデータ
nokonoko1203
0
180
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
120
ゆくKotlin くるRust
exoego
1
150
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
69
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Producing Creativity
orderedlist
PRO
348
40k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
250
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
110
How to build a perfect <img>
jonoalderson
0
4.6k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
400
Building Adaptive Systems
keathley
44
2.9k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
100
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
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]