Sobes.tech
Middle

Да ли сте упознати са коришћењем Dagger у развоју Android апликација?

sobes.tech АИ

Одговор од АИ

Да, познајем. Dagger је оквир за убризгавање зависности (Dependency Injection, DI) у Јави и Андроид-у, који се компилира током изградње и омогућава креирање оптимизованог, продуктивног и лако тестирачког кода.

Главне концепције укључују:

  • Модуле (Modules): Обезбеђују зависности. Обележавају се са @Module. Унутар модула, методе са @Provides описују како креирати одређену зависност.
    @Module
    public class AppModule {
    
        @Provides
        // пружа контекст апликације
        Context provideAppContext(Application application) {
            return application.getApplicationContext();
        }
    
        @Provides
        // пружа SharedPreferences
        SharedPreferences provideSharedPreferences(Context context) {
            return context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
        }
    }
    
  • Компоненте (Components): Повезују модуле и убризгавају зависности. Обележавају се са @Component. Компоненте су "графови зависности".
    @Singleton
    @Component(modules = {AppModule.class})
    // компоненте апликације
    public interface AppComponent {
    
        // метод за убризгавање у MainActivity
        void inject(MainActivity activity);
    
        // метод за добијање SharedPreferences из графа
        SharedPreferences getSharedPreferences();
    }
    
  • Убризгавање (Injection): Процес убризгавања зависности. Користи се @Inject за поља или конструкторе.
    public class MainActivity extends AppCompatActivity {
    
        @Inject
        // зависност коју ће Dagger убризгати
        SharedPreferences sharedPrefs;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Dagger генерише код за креирање компонента и убризгавање
            ((MyApplication) getApplication()).getAppComponent().inject(this);
    
            // сада је sharedPrefs доступан
            String value = sharedPrefs.getString("key", "default");
            Log.d("MainActivity", "Вредност из SharedPreferences: " + value);
        }
    }
    
  • Области (Scopes): Омогућавају управљање животним циклусом зависности. @Singleton за зависности са животним циклусом апликације, корисничке анотације за ширије области (нпр. @PerActivity).
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    // корисничка област за активност
    public @interface PerActivity {}
    

Dagger такође подржава подкомпоненте (@Subcomponent) за креирање мањих, хијерархијских графова зависности, што је корисно за модуларне апликације или за зависности са кратким животним циклусом (нпр. корисничке сесије или конкретни екран).

Главне предности коришћења Dagger-а:

  • Производљивост: Генерисани код током компилације минимизира трошкове извршавања у поређењу са рефлексивним DI оквирима.
  • Провера: Компилатор проверава граф зависности, открива грешке током изградње, а не при извршавању.
  • Тестираност: Олакшава замену стварних зависности са mock објектима током тестирања.
  • Читљивост и одрживост: Јасно описује зависности компоненти система.