Middle
Povězte mi o frameworku Dagger.
sobes.tech AI
Odpověď od AI
Dagger je rámec pro závislostní injekci (dependency injection, DI) v Javě a Androidu. Je založen na specifikaci JSR-330. Dagger V2 používá generování kódu při kompilaci, což vylučuje režie během běhu, které jsou typické pro reflexivní DI rámce.
Klíčové pojmy Dagger:
- Moduly (
@Module): Třídy, které poskytují závislosti. Uvnitř nich metody označené@Providesvracejí instance objektů, které Dagger může injektovat.
@Module
public class AppModule {
@Provides
Context provideAppContext(Application app) {
return app.getApplicationContext();
}
}
- Komponenty (
@Component): Rozhraní, která spojují moduly a místa injekce závislostí. Obsahují metody, které vracejí instance závislostí nebo injekční metody (void inject(Target target);).
@Component(modules = AppModule.class)
public interface AppComponent {
Context getAppContext();
void inject(MyApplication application); // Injektovací metoda
}
- Injekce (
@Inject): Anotace, která ukazuje Daggeru, kde je třeba poskytnout závislost. Může být použita na konstruktor, pole nebo metody.
public class UserManager {
private final UserRepository userRepository;
@Inject // Injekce přes konstruktor
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
public class MainActivity extends AppCompatActivity {
@Inject // Injekce přes pole
UserManager userManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
// Získání komponenty a injektování závislostí
((MyApplication) getApplication()).getAppComponent().inject(this);
}
}
- Rozsah (
@Singleton,@Scope): Anotace určující dobu života poskytovaných závislostí. Výchozí je@Singleton, ale lze vytvářet vlastní anotace 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 Daggeru:
- Výkon: Generování kódu při kompilaci minimalizuje režii během běhu.
- Typová bezpečnost: Chyby v grafu závislostí jsou odhaleny při kompilaci.
- Testovatelnost: Generovaný kód Daggeru je čitelný.
- Snadné testování: Závislosti lze snadno nahradit mocky.
Nevýhody:
- Strmá křivka učení.
- Složitá syntaxe v některých případech.
- Zvýšení doby kompilace.
Dagger je aktivně používán ve velkých Android aplikacích pro správu závislostí a strukturování kódu.