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@Providesvrać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.