Sobes.tech
Middle

Znáte použití Dagger při vývoji Android aplikací?

sobes.tech AI

Odpověď od AI

Ano, znám to. Dagger je rámec pro vkládání závislostí (Dependency Injection, DI) v jazyce Java a Android, který se kompiluje během sestavení a umožňuje vytvářet optimalizovaný, výkonný a snadno testovatelný kód.

Hlavní koncepty zahrnují:

  • Moduly (Modules): Poskytují závislosti. Označují se @Module. Uvnitř modulu metody s @Provides popisují, jak vytvořit konkrétní závislost.
    @Module
    public class AppModule {
    
        @Provides
        // poskytuje kontext aplikace
        Context provideAppContext(Application application) {
            return application.getApplicationContext();
        }
    
        @Provides
        // poskytuje SharedPreferences
        SharedPreferences provideSharedPreferences(Context context) {
            return context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        }
    }
    
  • Komponenty (Components): Spojují moduly a vkládají závislosti. Označují se @Component. Komponenty jsou "grafy závislostí".
    @Singleton
    @Component(modules = {AppModule.class})
    // komponenta aplikace
    public interface AppComponent {
    
        // metoda pro injekci do MainActivity
        void inject(MainActivity activity);
    
        // metoda pro získání SharedPreferences ze schématu
        SharedPreferences getSharedPreferences();
    }
    
  • Injekce (Injection): Proces vkládání závislostí. Používá se @Inject pro pole nebo konstruktory.
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        // závislost, kterou Dagger vloží
        SharedPreferences sharedPrefs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Dagger generuje kód pro vytvoření komponenty a injekci
            ((MyApplication) getApplication()).getAppComponent().inject(this);
    
            // nyní je sharedPrefs dostupný
            String value = sharedPrefs.getString("key", "default");
            Log.d("MainActivity", "Hodnota ze SharedPreferences: " + value);
        }
    }
    
  • Scope (Rozsahy): Umožňují řídit životní cyklus závislostí. @Singleton pro závislosti s životním cyklem aplikace, vlastní anotace pro užší oblasti (například @PerActivity).
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    // vlastní rozsah pro aktivitu
    public @interface PerActivity {}
    

Dagger také podporuje podkomponenty (@Subcomponent) pro vytváření menších, hierarchických grafů závislostí, což je užitečné pro modulární aplikace nebo závislosti s krátkým životním cyklem (například uživatelské relace nebo konkrétní obrazovky).

Hlavní výhody používání Dagger:

  • Výkon: Generování kódu během kompilace minimalizuje režii při běhu ve srovnání s reflexivními DI rámcemi.
  • Kontrola: Kompilátor kontroluje graf závislostí, odhaluje chyby při sestavení, nikoli za běhu.
  • Testovatelnost: Umožňuje snadnou výměnu skutečných závislostí za mock objekty při testování.
  • Čitelnost a udržovatelnost: Jasně popisuje závislosti komponent systému.