Sobes.tech
Middle

Opowiedz o frameworku Dagger.

sobes.tech AI

Odpowiedź od AI

Dagger to framework do wstrzykiwania zależności (dependency injection, DI) w Java i Android. Opiera się na specyfikacji JSR-330. Dagger V2 korzysta z generacji kodu na etapie kompilacji, co eliminuje koszty narzutu podczas działania, charakterystyczne dla refleksyjnych frameworków DI.

Kluczowe pojęcia Dagger:

  • Moduły (@Module): Klasy dostarczające zależności. Wewnątrz nich metody oznaczone @Provides zwracają instancje obiektów, które Dagger może wstrzyknąć.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Komponenty (@Component): Interfejsy łączące moduły i miejsca wstrzykiwania zależności. Zawierają metody zwracające instancje zależności lub metody wstrzykiwania (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Metoda wstrzykiwania
}
  • Wstrzykiwanie (@Inject): Adnotacja wskazująca Dagger, gdzie należy dostarczyć zależność. Może być stosowana do konstruktorów, pól i metod.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Wstrzykiwanie przez konstruktor
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Wstrzykiwanie przez pole
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Uzyskanie komponentu i wstrzyknięcie zależności
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Zakres (@Singleton, @Scope): Adnotacje określające czas życia dostarczanych zależności. Domyślnie @Singleton, można tworzyć własne adnotacje zakresu.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Zalety Dagger:

  • Wydajność: Generacja kodu na etapie kompilacji minimalizuje koszty w czasie działania.
  • Bezpieczeństwo typów: Błędy w grafie zależności są wykrywane na etapie kompilacji.
  • Czytelność: Kod Dagger jest czytelny.
  • Łatwość testowania: Zależności można łatwo zastąpić mockami.

Wady:

  • Stroma krzywa uczenia się.
  • Skomplikowana składnia w niektórych przypadkach.
  • Wydłużony czas kompilacji.

Dagger jest szeroko stosowany w dużych aplikacjach Android do zarządzania zależnościami i strukturyzacji kodu.