Sobes.tech
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é @Provides vracejí 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.