Middle
Povedzte mi o rámci Dagger.
sobes.tech AI
Odpoveď od AI
Dagger je rámec za injekciu závislostí (dependency injection, DI) v Jave a Android. Je založený na špecifikácii JSR-330. Dagger V2 používa generovanie kódu počas kompilácie, čím odstraňuje režijné náklady počas behu, ktoré sú typické pre reflexívne DI rámce.
Kľúčové pojmy Dagger:
- Moduly (
@Module): Triedy, ktoré poskytujú závislosti. V nich metódy označené@Providesvracajú inštancie objektov, ktoré Dagger môže injektovať.
@Module
public class AppModule {
@Provides
Context provideAppContext(Application app) {
return app.getApplicationContext();
}
}
- Komponenty (
@Component): Rozhrania, ktoré spájajú moduly a miesta injekcie závislostí. Obsahujú metódy, ktoré vracajú inštancie závislostí alebo injekčné metódy (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
Context getAppContext();
void inject(MyApplication application); // Injektovacia metóda
}
- Injektovanie (
@Inject): Anotácia, ktorá ukazuje Daggeru, kde je potrebné poskytnúť závislosť. Môže byť použitá na konštruktory, polia a metódy.
public class UserManager {
private final UserRepository userRepository;
@Inject // Injektovanie cez konštruktor
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
public class MainActivity extends AppCompatActivity {
@Inject // Injektovanie cez pole
UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
// Získanie komponentu a injektovanie závislostí
((MyApplication) getApplication()).getAppComponent().inject(this);
}
}
- Rozsah (
@Singleton,@Scope): Anotácie určujúce dobu života poskytovaných závislostí. Výchozí je@Singleton, ale je možné vytvárať vlastné anotácie rozsahu.
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}
@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
Výhody Dagger:
- Výkon: Generovanie kódu počas kompilácie minimalizuje režijné náklady počas behu.
- Typová bezpečnosť: Chyby v grafe závislostí sú odhalené počas kompilácie.
- Testovateľnosť: Generovaný kód Dagger je čitateľný.
- Jednoduché testovanie: Závislosti je možné ľahko nahradiť mockmi.
Nevýhody:
- Strmá krivka učenia.
- Složitá syntax v niektorých prípadoch.
- Zvýšenie času kompilácie.
Dagger sa aktívne používa v veľkých Android aplikáciách na správu závislostí a štruktúrovanie kódu.