Middle
Papaskinkite apie Dagger karkasą.
sobes.tech AI
Atsakymas iš AI
Dagger yra karkasas priklausomybių injekcijai (dependency injection, DI) Java ir Android aplinkose. Jis pagrįstas JSR-330 specifikacija. Dagger V2 naudoja kodo generavimą kompiliacijos metu, kas pašalina vykdymo metu būdingas išlaidas, būdingas refleksiniams DI karkasams.
Dagger pagrindinės sąvokos:
- Moduliai (
@Module): Klasės, kurios teikia priklausomybes. Joje pažymėtos@Providesmetodai grąžina objektų pavyzdžius, kuriuos Dagger gali injekuoti.
@Module
public class AppModule {
@Provides
Context provideAppContext(Application app) {
return app.getApplicationContext();
}
}
- Komponentai (
@Component): Sąsajos, kurios jungia modulius ir injekcijos vietas. Jos turi metodus, kurie grąžina priklausomybių pavyzdžius arba injekcijos metodus (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
Context getAppContext();
void inject(MyApplication application); // Injekcijos metodas
}
- Injekcija (
@Inject): Anotacija, rodanti Dagger, kur turi būti teikiama priklausomybė. Ji gali būti taikoma konstruktoriams, laukams ir metodams.
public class UserManager {
private final UserRepository userRepository;
@Inject // Injekcija per konstruktorių
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
public class MainActivity extends AppCompatActivity {
@Inject // Injekcija per lauką
UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
// Gauti komponentą ir injekuoti priklausomybes
((MyApplication) getApplication()).getAppComponent().inject(this);
}
}
- Aprėptis (
@Singleton,@Scope): Anotacijos, kurios apibrėžia teikiamų priklausomybių gyvavimo laiką. Numatyta@Singleton, tačiau galima kurti savo apimties anotacijas.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}
@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
Dagger privalumai:
- Našumas: Kodo generavimas kompiliacijos metu sumažina vykdymo metu patiriamas išlaidas.
- Tipų saugumas: Klaidos priklausomybių grafike aptinkamos kompiliacijos metu.
- Testuojamumas: Dagger sugeneruotas kodas yra skaitomas.
- Lengvas testavimas: Priklausomybes lengvai galima pakeisti mock'ais.
Trūkumai:
- Staigi mokymosi kreivė.
- Kartais sudėtinga sintaksė.
- Padidėjęs kompiliacijos laikas.
Dagger aktyviai naudojamas dideliuose Android projektuose priklausomybių valdymui ir kodo struktūrizavimui.