Sobes.tech
Middle

Tell us about the Dagger framework.

sobes.tech AI

Answer from AI

Dagger is a framework for dependency injection (DI) in Java and Android. It is based on the JSR-330 specification. Dagger V2 uses compile-time code generation, which eliminates runtime overhead typical of reflective DI frameworks.

Key concepts of Dagger:

  • Modules (@Module): Classes that provide dependencies. Inside them, methods annotated with @Provides return instances of objects that Dagger can inject.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Components (@Component): Interfaces that connect modules and dependency injection sites. They contain methods that return dependency instances or injection methods (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Injection method
}
  • Injection (@Inject): Annotation indicating where Dagger should provide a dependency. It can be applied to constructors, fields, and methods.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Constructor injection
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Field injection
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Obtain component and inject dependencies
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Scope (@Singleton, @Scope): Annotations defining the lifetime of provided dependencies. @Singleton by default, but custom scope annotations can be created.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
}

Advantages of Dagger:

  • Performance: Compile-time code generation minimizes runtime overhead.
  • Type safety: Dependency graph errors are detected at compile time.
  • Verifiability: Dagger-generated code is readable.
  • Testability: Dependencies can be easily replaced with mocks.

Disadvantages:

  • Steep learning curve.
  • Complex syntax in some cases.
  • Increased compilation time.

Dagger is actively used in large Android applications for dependency management and code structuring.