Sobes.tech
Middle

Реците о оквиру Dagger.

sobes.tech АИ

Одговор од АИ

Dagger je okvir za ubrizgavanje zavisnosti (dependency injection, DI) u Javi i Androidu. Osnovan je na specifikaciji JSR-330. Dagger V2 koristi generisanje koda u fazi kompilacije, čime se isključuju troškovi tokom izvršavanja, karakteristični za refleksivne DI okvire.

Ključni pojmovi Dagger-a:

  • Moduli (@Module): Klase koje obezbeđuju zavisnosti. Unutar njih, metode označene sa @Provides vraćaju instance objekata koje Dagger može ubrizgati.
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Komponente (@Component): Interfejsi koji povezuju module i mesta ubrizgavanja zavisnosti. Sadrže metode koje vraćaju instance zavisnosti ili metode za ubrizgavanje (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Metod ubrizgavanja
}
  • Ubrizgavanje (@Inject): Anotacija koja ukazuje Dagger-u gde treba obezbediti zavisnost. Može se primenjivati na konstruktore, polja i metode.
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Ubrizgavanje putem konstruktora
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Ubrizgavanje putem polja
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Dobijanje komponente i ubrizgavanje zavisnosti
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Opseg (@Singleton, @Scope): Anotacije koje određuju vreme trajanja obezbeđenih zavisnosti. Podrazumevano je @Singleton, ali se mogu praviti sopstvene anotacije opsega.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

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

Prednosti Dagger-a:

  • Performanse: Generisanje koda u fazi kompilacije minimizira troškove tokom izvršavanja.
  • Tipova bezbednost: Greške u grafu zavisnosti se otkrivaju tokom kompilacije.
  • Proverljivost: Generisani kod Dagger-a je čitljiv.
  • Lako testiranje: Zavisnosti se lako mogu zameniti mock-ovima.

Nedostaci:

  • Strma krivina učenja.
  • Složena sintaksa u nekim slučajevima.
  • Povećanje vremena kompilacije.

Dagger se aktivno koristi u velikim Android aplikacijama za upravljanje zavisnostima i strukturiranje koda.