SlideShare a Scribd company logo
1 of 70
Download to read offline
Building maintainable
app with MVP and
Dagger2
KRISTIJAN JURKOVIĆ
ANDROID TEAM LEAD @ INFINUM
We're an independent
design & development
agency.
INFINUM
• 90 people in 3 offices
• 15 android developers
• hundreds of projects
OUR BIGGEST ISSUES?
“Sometimes when you fill a vacuum, it still
sucks.”
― Dennis Ritchie
MVP TO THE RESCUE?
PROGRAM TO INTERFACES
NOT IMPLEMENTATIONS
ModelPresenterView
LoginActivity LoginPresenterImpl LoginInteractorImpl
LoginView LoginPresenter LoginInteractor
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
login(username, pass)
loginPresenter loginView
loginInteractor
login(username, pass) login(username, pass,
listener)
login(username, pass,
listener)
VIEW PRESENTER MODEL
public interface HomeView {
...
}
public interface HomePresenter {
...
}
public interface CurrencyInteractor {
...
}
VIEW
PRESENTER
MODEL
public interface HomeView {
...
}
VIEW
public class HomeActivity
extends BaseActivity
implements HomeView {
// this is an interface
HomePresenter presenter;
...
}
public interface HomePresenter {
...
}
PRESENTER
public class HomePresenterImpl
implements HomePresenter {
// interface
private HomeView view;
// and another interface
private CurrencyInteractor interactor;
public HomePresenterImpl(
HomeView view, CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
...
}
public interface CurrencyInteractor {
...
}
MODEL
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
}
HOW SHOULD I GET MY
CONTENT?
public interface HomeView {
void showCurrencies(List<Currency> currencies);
}
public interface HomePresenter {
void loadCurrencyList();
}
public interface CurrencyInteractor {
void getCurrencyList(CurrencyListener listener);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
public class HomePresenterImpl
implements HomePresenter {
...
@Override
public void loadCurrencyList() {
interactor.getCurrencyList(...);
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
...
@Override
public void getCurrencyList(
CurrencyListener listener) {
// do API/DB call
// return result with listener
}
}
VIEW SHOULDN’T CREATE ITS
DEPENDENCIES
DEPENDENCY INJECTION
JSR 330
• 5 annotations - @Named, @Inject, @Qualifier, @Scope,
@Singleton
• 1 interface - Provider<T>
DAGGER2 TO THE RESCUE
DAGGER 2
• @Module, @Provides, @Component, @Subcomponent,
ScopedProvider
• Injection into Fields, Constructors, Methods
• Each @Inject has to have its @Provides
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
@Module
public class GsonConverterModule {
@Provides
@Singleton
public Converter.Factory
provideConverter(Gson gson) {
return GsonConverterFactory.create(gson);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
@Component(modules = {
HostModule.class,
GsonConverterModule.class,
ClientModule.class,
LoggerModule.class,
ExecutorsModule.class,
ApiModule.class,
GsonModule.class
})
@Singleton
public interface AppComponent {
}
public class MyApplication extends Application {
protected AppComponent appComponent;
protected void init() {
appComponent = DaggerAppComponent.create();
}
}
HOW CAN WE REUSE THAT
IN OUR ACTIVITIES?
public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data 

}
}
• Inject presenter into view
• Inject view and interactor into presenter
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
public class CurrencyInteractorImpl
implements CurrencyInteractor {
@Inject
public CurrencyInteractorImpl(ApiService service) {
}
}
@Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
public class HomePresenterImpl
implements HomePresenter {
@Inject
public HomePresenterImpl(HomeView view,
CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
}
public class HomeActivity
extends BaseActivity
implements HomeView {
@Inject
HomePresenter presenter;
}
@Subcomponent(modules = HomeModule.class)
public interface HomeComponent {
void inject(HomeActivity activity);
}
WHAT’S THAT
“SUBCOMPONENT” THING
YOU MENTIONED?
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
EXECUTORS
MODULE
@Component(modules = {
...
})
@Singleton
public interface AppComponent {
HomeComponent plus(HomeModule module);
}
public abstract class BaseActivity
extends AppCompatActivity {
Override
protected void onCreate(Bundle savedInstanceState) {
...
injectDependencies(MyApplication.getAppComponent());
}
protected abstract
void injectDependencies(AppComponent appComponent);
}
public class HomeActivity
extends BaseActivity
implements HomeView {
protected void
injectDependencies(AppComponent appComponent) {
appComponent
.plus(new HomeModule(this))
.inject(this);
}
}
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
HOME
MODULE
HOMECOMPONENT
SESSIONCOMPONENT
SESSION
MODULE
EXECUTORS
MODULE
SATISFACTION LEVEL 9001
“If you don’t like testing your product, most
likely your customers won’t like to test it
either.”
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APP COMPONENT
HOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
EXECUTORS
MODULE
APPTESTCOMPONENT
MOCKHOST
MODULE
CONVERTER
MODULE
CLIENT
MODULE
LOGGER
MODULE
API
MODULE
GSON
MODULE
SYNC
EXECUTORS
MODULE
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
@Component(modules = {
...
MockHostModule.class,
SynchronousExecutorsModule.class,
...
})
@Singleton
public interface AppTestComponent extends AppComponent {
void inject(MyTestApplication app);
}
public class MyTestApplication
extends MyApplication
implements TestLifecycleApplication {
@Override
protected void init() {
appComponent = DaggerAppTestComponent.create();
}
}
protected void enqueueResponse(String filename) {
String body = ResourceUtils.readFromFile(filename);
MockResponse mockResponse =
new MockResponse()
.setBody(body)
.setResponseCode(HttpURLConnection.HTTP_OK);
mockWebServer.enqueue(mockResponse);
}
@Override
public void setup() throws Exception {
super.setup();
controller = Robolectric
.buildActivity(MockActivity.class)
.create()
.start()
.resume()
.visible();
fragment = DashboardDrivingModeFragment.newInstance();
controller.get().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, null)
.commit();
ButterKnife.bind(this, fragment.getView());
}
@Test
public void testEmptyStateNotVisible() {
enqueueResponse(“rest-currency-response.json”);
btnCurrencyList.performClick();
assertThat(emptyView).isNotVisible();
}
THINGS TO REMEMBER
• Orientation change
THINGS TO REMEMBER
• Dagger2 is a powerful tool - make good use of it
• Save yourselves from regression bugs
REFERENCES
• http://antonioleiva.com/mvp-android/
• https://medium.com/@czyrux/presenter-surviving-
orientation-changes-with-
loaders-6da6d86ffbbf#.xou7c71uz
• http://frogermcs.github.io/dependency-injection-with-
dagger-2-custom-scopes/
• https://www.youtube.com/watch?v=oK_XtfXPkqw
Any questions?
KRISTIJAN.JURKOVIC@INFINUM.CO
@KJURKOVIC
Visit infinum.co or find us on social networks:
infinum.co infinumco infinumco infinum

More Related Content

What's hot

Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectFabio Collini
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next FrameworkCommit University
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency InjectionNir Kaufman
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshopNir Kaufman
 
Angular 8
Angular 8 Angular 8
Angular 8 Sunil OS
 
Angular 2: core concepts
Angular 2: core conceptsAngular 2: core concepts
Angular 2: core conceptsCodemotion
 
Beyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and moreBeyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and moreAri Lerner
 
The productive developer guide to Angular 2
The productive developer guide to Angular 2The productive developer guide to Angular 2
The productive developer guide to Angular 2Maurice De Beijer [MVP]
 
AngularJS - dependency injection
AngularJS - dependency injectionAngularJS - dependency injection
AngularJS - dependency injectionAlexe Bogdan
 
Angular js 2
Angular js 2Angular js 2
Angular js 2Ran Wahle
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - ServicesNir Kaufman
 

What's hot (20)

Angular2 + rxjs
Angular2 + rxjsAngular2 + rxjs
Angular2 + rxjs
 
Using Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture projectUsing Dagger in a Clean Architecture project
Using Dagger in a Clean Architecture project
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next Framework
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Angular2 workshop
Angular2 workshopAngular2 workshop
Angular2 workshop
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 
Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2Angular Workshop_Sarajevo2
Angular Workshop_Sarajevo2
 
Angular 8
Angular 8 Angular 8
Angular 8
 
Angular 2: core concepts
Angular 2: core conceptsAngular 2: core concepts
Angular 2: core concepts
 
Angular2 for Beginners
Angular2 for BeginnersAngular2 for Beginners
Angular2 for Beginners
 
Beyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and moreBeyond AngularJS: Best practices and more
Beyond AngularJS: Best practices and more
 
The productive developer guide to Angular 2
The productive developer guide to Angular 2The productive developer guide to Angular 2
The productive developer guide to Angular 2
 
AngularJS - dependency injection
AngularJS - dependency injectionAngularJS - dependency injection
AngularJS - dependency injection
 
Angular js-crash-course
Angular js-crash-courseAngular js-crash-course
Angular js-crash-course
 
Angular js 2
Angular js 2Angular js 2
Angular js 2
 
Angular2 - In Action
Angular2  - In ActionAngular2  - In Action
Angular2 - In Action
 
Di &amp; dagger
Di &amp; daggerDi &amp; dagger
Di &amp; dagger
 
Angular2
Angular2Angular2
Angular2
 
AngularJS - Services
AngularJS - ServicesAngularJS - Services
AngularJS - Services
 

Viewers also liked

Evolving the Android Core with Aspects
Evolving the Android Core with AspectsEvolving the Android Core with Aspects
Evolving the Android Core with AspectsCarlo Pescio
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternFabio Collini
 
World-Class Testing Development Pipeline for Android
 World-Class Testing Development Pipeline for Android World-Class Testing Development Pipeline for Android
World-Class Testing Development Pipeline for AndroidPedro Vicente Gómez Sánchez
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginXavier Hallade
 
Moderne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJavaModerne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJavainovex GmbH
 
Getting started with dagger 2
Getting started with dagger 2Getting started with dagger 2
Getting started with dagger 2Rodrigo Henriques
 
Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2Infinum
 
Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Matteo Bonifazi
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionStfalcon Meetups
 
Infinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android AppsInfinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android AppsInfinum
 
Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Hoang Huynh
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsGlobalLogic Ukraine
 
A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...Alessandro Martellucci
 
Android Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and PatternsAndroid Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and PatternsAdham Enaya
 
A Journey Through MV Wonderland
A Journey Through MV WonderlandA Journey Through MV Wonderland
A Journey Through MV WonderlandFlorina Muntenescu
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsNelson Glauber Leal
 
Android Architecture MVP Pattern
Android Architecture MVP Pattern Android Architecture MVP Pattern
Android Architecture MVP Pattern Jeff Potter
 
Add ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxAdd ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxBoris Farber
 
Android with dagger_2
Android with dagger_2Android with dagger_2
Android with dagger_2Kros Huang
 

Viewers also liked (20)

Evolving the Android Core with Aspects
Evolving the Android Core with AspectsEvolving the Android Core with Aspects
Evolving the Android Core with Aspects
 
Data Binding in Action using MVVM pattern
Data Binding in Action using MVVM patternData Binding in Action using MVVM pattern
Data Binding in Action using MVVM pattern
 
World-Class Testing Development Pipeline for Android
 World-Class Testing Development Pipeline for Android World-Class Testing Development Pipeline for Android
World-Class Testing Development Pipeline for Android
 
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental pluginMastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
Mastering the NDK with Android Studio 2.0 and the gradle-experimental plugin
 
Moderne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJavaModerne App-Architektur mit Dagger2 und RxJava
Moderne App-Architektur mit Dagger2 und RxJava
 
Getting started with dagger 2
Getting started with dagger 2Getting started with dagger 2
Getting started with dagger 2
 
Android talks #08 dagger2
Android talks #08   dagger2Android talks #08   dagger2
Android talks #08 dagger2
 
Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016Engage and retain users in the android world - Droidcon Italy 2016
Engage and retain users in the android world - Droidcon Italy 2016
 
Dagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency InjectionDagger 2. Right way to do Dependency Injection
Dagger 2. Right way to do Dependency Injection
 
Infinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android AppsInfinum Android Talks #12 - MVP design pattern for Android Apps
Infinum Android Talks #12 - MVP design pattern for Android Apps
 
Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016Crafting Great Hypotheses - Droidcon 2016
Crafting Great Hypotheses - Droidcon 2016
 
Dagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency InjectionsDagger 2. The Right Way to Dependency Injections
Dagger 2. The Right Way to Dependency Injections
 
A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...A realtime infrastructure for Android apps: Firebase may be what you need..an...
A realtime infrastructure for Android apps: Firebase may be what you need..an...
 
Android Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and PatternsAndroid Effective UI: Tips, Tricks and Patterns
Android Effective UI: Tips, Tricks and Patterns
 
A Journey Through MV Wonderland
A Journey Through MV WonderlandA Journey Through MV Wonderland
A Journey Through MV Wonderland
 
Cloud Design Pattern
Cloud Design PatternCloud Design Pattern
Cloud Design Pattern
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
Android Architecture MVP Pattern
Android Architecture MVP Pattern Android Architecture MVP Pattern
Android Architecture MVP Pattern
 
Add ClassyShark to your Android toolbox
Add ClassyShark to your Android toolboxAdd ClassyShark to your Android toolbox
Add ClassyShark to your Android toolbox
 
Android with dagger_2
Android with dagger_2Android with dagger_2
Android with dagger_2
 

Similar to Building maintainable app

Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Stephan Hochdörfer
 
Android architecture
Android architecture Android architecture
Android architecture Trong-An Bui
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionStephan Hochdörfer
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorialAnh Quân
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS DevelopmentJussi Pohjolainen
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-DurandSOAT
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpdayStephan Hochdörfer
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributesMarco Eidinger
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Antoine Sabot-Durand
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIVisual Engineering
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development GuideNitin Giri
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lectureTsvyatko Konov
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flexprideconan
 

Similar to Building maintainable app (20)

Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13Real World Dependency Injection - oscon13
Real World Dependency Injection - oscon13
 
Android architecture
Android architecture Android architecture
Android architecture
 
Real World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring EditionReal World Dependency Injection - IPC11 Spring Edition
Real World Dependency Injection - IPC11 Spring Edition
 
Google GIN
Google GINGoogle GIN
Google GIN
 
Guice tutorial
Guice tutorialGuice tutorial
Guice tutorial
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
 
Devoxx 2012 (v2)
Devoxx 2012 (v2)Devoxx 2012 (v2)
Devoxx 2012 (v2)
 
S313937 cdi dochez
S313937 cdi dochezS313937 cdi dochez
S313937 cdi dochez
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
CDI in JEE6
CDI in JEE6CDI in JEE6
CDI in JEE6
 
Real World Dependency Injection - phpday
Real World Dependency Injection - phpdayReal World Dependency Injection - phpday
Real World Dependency Injection - phpday
 
A tour through Swift attributes
A tour through Swift attributesA tour through Swift attributes
A tour through Swift attributes
 
Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014Introduction to cdi given at java one 2014
Introduction to cdi given at java one 2014
 
Workshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte IIWorkshop 13: AngularJS Parte II
Workshop 13: AngularJS Parte II
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development Guide
 
Angular Dependency Injection
Angular Dependency InjectionAngular Dependency Injection
Angular Dependency Injection
 
Introduction to CDI
Introduction to CDIIntroduction to CDI
Introduction to CDI
 
Net conf BG xamarin lecture
Net conf BG xamarin lectureNet conf BG xamarin lecture
Net conf BG xamarin lecture
 
Parsley & Flex
Parsley & FlexParsley & Flex
Parsley & Flex
 
What is your money doing?
What is your money doing?What is your money doing?
What is your money doing?
 

Recently uploaded

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 

Recently uploaded (20)

HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 

Building maintainable app