Provider • For each @Provides annotation dagger generates a Provider * • Dagger’s Factory interface is also a Provider • Dagger has various implementations of Providers: • SingleCheck • DoubleCheck (javax.inject) * Not for unscoped dependencies - Coming up
DoubleCheck Memoizes value using Double-Check idiom. public T get() { Object result = instance; if (result == UNINITIALIZED) { synchronized (this) { result = instance; if (result == UNINITIALIZED) { result = provider.get();
Object currentInstance = instance; // other code instance = result;
DoubleCheck Memoizes value using Double-Check idiom. public T get() { Object result = instance; if (result == UNINITIALIZED) { synchronized (this) { result = instance; if (result == UNINITIALIZED) { result = provider.get();
Object currentInstance = instance; // other code instance = result;
DoubleCheck Memoizes value using Double-Check idiom. public T get() { Object result = instance; if (result == UNINITIALIZED) { synchronized (this) { result = instance; if (result == UNINITIALIZED) { result = provider.get();
Object currentInstance = instance; // other code instance = result;
@Singleton vs @Reusable vs No Scope • Heavy mutable object with State : @Singleton • Heavy immutable object / stateless : @Reusable • Not Heavy : No Scope •
DaggerAppComponent • schedulerProvider() : @Singleton • userManager : @Singleton LoginComponentImpl <> AppComponent fun schedulerProvider() Sub Component LoginComponent accesses any dependencies of DaggerAppComponent directly as inner class can access outer class members. @Singleton @ActivityScope
DaggerUserComponent • schedulerProvider • pokemon DaggerAppComponent • schedulerProvider() : @Singleton • userManager : @Singleton LoginComponentImpl <> AppComponent fun schedulerProvider() HomeComponentImpl ItemsComponentImpl Dependent Component UserComponent accesses any dependencies of DaggerAppComponent via an interface of AppComponent. @Singleton @ActivityScope @UserScope @ActivityScope @ActivityScope Sub Component LoginComponent accesses any dependencies of DaggerAppComponent directly as inner class can access outer class members.
DaggerUserComponent • schedulerProvider • pokemon DaggerAppComponent • schedulerProvider() : @Singleton • userManager : @Singleton LoginComponentImpl <> AppComponent fun schedulerProvider() HomeComponentImpl ItemsComponentImpl @Singleton @ActivityScope @UserScope @ActivityScope @ActivityScope Sub Component LoginComponent accesses any dependencies of DaggerAppComponent directly as inner class can access outer class members. Dependent Component UserComponent accesses any dependencies of DaggerAppComponent via an interface of AppComponent.
@Module abstract class AppBindingModule { @ContributesAndroidInjector(modules = arrayOf(LoginModule::class)) @ActivityScope internal abstract fun loginActivity(): LoginActivity } AppBindingModule No need to create LoginActivitySubcomponent class in the above case. @ContributesAndroidInjector AppBindingModule
DispatchingAndroidInjector Provider LoginActivity.class Class Provider DispatchingAndroidInject • gets the Subcomponent.Builder from injectorFactory. • creates an instance using Builder. • calls component.inject(instance) to perform injections. • Injects members for Android types : Activity, Fragment, etc • Has a Map> injectorFactories.