kelemahan – Konfigurasi dataSource tersebar di banyak tempat, xxxDao – Object dataSource tidak bisa di share, misalkan cukup 1 instance saja – Bila ada perubahan, akan terjadi di banyak tempat – Bila ada perubahan, proses compile akan dijalankan di semua file yang berubah, bisa jadi full compile karena banyak class yang terlibat
terkait “dataSource” hanya perlu dilakukan di satu tempat saja, yakni di mana “dataSource” diinisialisasi – Dalam membuat unit test, dengan mudah kita bisa mengganti “dependencies” yang dibutuhkan dengan test double atau mock object – Aplikasi bisa lebih mudah dimaintain
mana kita membuat suatu object untuk menyediakan dependencies yang dibutuhkan object lain. Dependency adalah object bisa digunakan (service). Injection adalah memberikan dependency yang dibutuhkan oleh object yang membutuhkan (client). Tujuan utamanya adalah menyediakan service yang dibutuhkan oleh client, bukan membiarkan client membuat sendiri service yang dibutuhkan.
get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn't want you to have. You might even be looking for something we don't even have or which has expired. What you should be doing is stating a need, "I need something to drink with lunch," and then we will make sure you have something when you sit down to eat. John Munsch, 28 October 2009.
injection framework untuk Java dan Android – Full static berarti dependency tidak bisa diganti pada waktu runtime – Compile-time berarti proses merangkai dependency terjadi pada saat compile, dimana Dagger akan mengenerate code yang diperlukan • Merupakan adopsi dari Dagger 1 yang dibuat oleh Square
@Component • Object yang akan menyediakan services • Tempat untuk mendeklarasikan client yang membutuhkan – @Module • Tempat untuk mendeklarasikan dan menginisialisasi services – Scope • Menandai bahwa services bisa di share – Qualifier • Menandai suatu service dengan keyword agar bisa ada lebih dari satu instance service dengan tipe yang sama, namun memiliki konfigurasi yang berbeda
method yang bertugas menyediakan service(s), ditandai dengan annotasi @Provide – Konvensinya, method harus diawali dengan kata provide dan disambung dengan nama service
Dalam annotasi perlu disebutkan module-module yang digunakan untuk memprovide service • Berisi method untuk medeklarasikan client – Konvensinya, nama method adalah inject – Client dijadikan sebagai parameter dari method
prefix Dagger[ComponentClass] public final class DaggerAppComponent implements AppComponent { private DaggerAppComponent(Builder builder) {} public static Builder builder() { return new Builder(); } public static AppComponent create() { return new Builder().build(); } //. }
claimed to be 15-20 percent faster than non static solution • Because there no module instantiation, Dagger will generate static provide method implementation • But, we can’t use static solution to a module than hold a reference
can get only 1 instance per component • It is good to strict number of instance of object that can be reused or takes time to create • But it comes with a cost, because Dagger will wrap the factory into DoubleCheck to make sure only 1 instance that will be instantiated • So, use Scope only when necessary
rather than single God Component • Usually used when we need different scope than parent component • Equals with dependent component, ie component that need dependencies to another component – Parent component have to expose the dependencies that needed by child component • But have subcomponent is annotated with @Subcomponent