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@Provideszwracają 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.