Saya telah membaca lebih lanjut tentang prinsip Inversion of Control dan Dependency Injection sebagai implementasi dan saya yakin saya memahaminya.
Tampaknya pada dasarnya mengatakan 'jangan deklarasikan anggota kelas Anda' di dalam kelas '. Alih-alih bahwa instansiasi harus dilewatkan dan ditugaskan melalui konstruktor; 'disuntikkan' ke dalam kelas dari sumber luar.
Jika sesederhana ini, yang tampaknya seperti itu, mengapa kita membutuhkan kerangka kerja seperti pegas atau guice yang menerapkan ini dengan anotasi? Apakah saya melewatkan sesuatu yang mendasar di sini? Saya benar-benar berjuang untuk memahami apa penggunaan kerangka kerja Dependency Injection.
Sunting: Tentang kemungkinan duplikat, saya yakin pertanyaan saya lebih unik karena menanyakan tentang kerangka kerja DI secara umum, bukan hanya Spring. Spring bukan hanya kerangka DI, jadi ada banyak alasan bahwa seseorang ingin menggunakan Spring yang tidak terkait dengan DI.
Jawaban:
Kami tidak membutuhkan kerangka kerja. Sangat mungkin untuk menerapkan injeksi ketergantungan secara manual, bahkan untuk proyek yang relatif besar.
Di sisi lain, menggunakan kerangka kerja membuatnya lebih mudah, terutama yang didasarkan pada anotasi atau deteksi otomatis dependensi, karena membuat prosesnya lebih sederhana: jika saya memutuskan bahwa saya memerlukan dependensi baru di kelas, yang harus saya lakukan adalah menambahkan ke konstruktor (atau mendeklarasikan setter) dan objek disuntikkan - Saya tidak perlu mengubah kode Instansiasi.
Juga, kerangka kerja sering mengandung fungsi berguna lainnya. Spring, misalnya, berisi kerangka kerja yang berguna untuk pemrograman berorientasi aspek, termasuk demarkasi transaksi deklaratif (yang sangat praktis) dan berbagai implementasi adaptor yang membuat banyak perpustakaan pihak ke-3 lebih mudah untuk diintegrasikan.
sumber
Mengapa kita perlu DI (Injeksi Ketergantungan) sama sekali?
Mekanisme DI memisahkan produksi objek dari konsumsi objek. Ketergantungan objek yang dibutuhkan dikirimkan secara transparan dari luar. Keuntungan dari mekanisme ini jelas: Anda dapat kapan saja menukar dependensi, mis. Menggunakan Obyek Null untuk tujuan pengujian.
Bagaimana ini dilakukan?
Ada beberapa cara untuk mencapai tujuan:
Apakah kita membutuhkan kerangka kerja DI?
Tidak, tidak sama sekali. Anda cukup meneruskan semua instance ke objek lain secara manual. Jika Anda memiliki aplikasi kecil, tidak perlu wadah pegas.
Tetapi di sisi lain, kerangka memberi Anda uluran tangan, mengelola objek:
Mereka membantu Anda menghubungkan hubungan objek yang kompleks. Anda harus menulis kode tanpa boilerplate, untuk menghasilkan instance dan meneruskannya ke objek yang sesuai
Mereka membantu Anda mengontrol ketika suatu objek dibuat: Anda dapat membuat instance saat bootstrap aplikasi, tetapi dalam beberapa kasus penciptaan malas - hanya saat dibutuhkan - lebih baik
Mereka membantu Anda mengontrol berapa banyak instance yang dibuat: satu per aplikasi seumur hidup atau satu per permintaan (jika Anda melakukan pemrograman web)
Jika proyek Anda memiliki ukuran yang sesuai - jika Anda merasa perlu untuk menulis lebih sedikit kode boilerplate - sangat masuk akal menggunakan kerangka kerja (DI-). Ada lebih banyak pro dan kontra.
sumber
Dengan musim semi, sebagian besar masalah kenyamanan.
Jika Anda memiliki kelas
TopLevel
yang membangun kelasMiddleLevel
yang membangun kelasLowLevel
, dan Anda menyadari bahwa Anda memerlukan parameter konstruktor baruLowLevel
, Anda juga harus menambahkannya keTopLevel
, dan untukMiddleLevel
, sederhananya sehingga ketika saatnya untukMiddleLevel
membangun suatuLowLevel
nilai akan tersedia sehingga dapat diteruskan ke konstruktornya. Dengan musim semi, Anda cukup menambahkan anotasi.Juga, dengan pegas, dimungkinkan untuk menentukan dependensi dalam file konfigurasi eksternal, bukan xml, dan ini seharusnya memberi Anda kemampuan untuk menghasilkan sistem baru dengan kabel yang sama sekali berbeda "tanpa mengubah kode apa pun". (IMHO ini benar-benar salah arah, karena mengubah xml tidak jauh berbeda dengan mengubah kode, dan sebenarnya, kode biasanya memiliki pengecekan error dan mengetik yang jauh lebih baik daripada xml.)
Hal lain adalah banyak orang takut pada konstruktor; mereka tidak mengerti mereka, mereka tidak menyukainya, mereka lebih suka tidak menggunakannya.
sumber
MiddleLevel
, tetapi harus menerimanya saat membangunTopLevel
sebagai argumen ke konstruktor. Demikian jugaMiddleLevel
harus menerimaLowLevel
dalam konstruktornya.Beberapa tahun yang lalu saya menulis sebuah program untuk memonitor halaman web, portlet web, bahkan tabel database tertentu, di perusahaan tempat saya bekerja. Saya ingin itu cukup fleksibel sehingga pengguna dapat menentukan monitor mana yang akan berjalan dan dengan parameter mana (url, login, kriteria keberhasilan, dll.). Jadi saya menulisnya untuk membaca dari file XML dan menggunakan Java refleksi untuk membuat instance kelas yang ditentukan dan menggunakan metode setter untuk mengatur parameter yang ditentukan.
Kemudian saya menemukan bahwa Spring akan melakukan hal yang sama untuk Anda, dan banyak lagi.
Jadi dalam kasus saya, saya menemukan itu
Menggunakan kerangka kerja injeksi ketergantungan membantu membuat program fleksibel dan membuatnya lebih mudah untuk menentukan bagaimana itu akan beroperasi (tentu saja dalam parameter yang didefinisikan dengan baik).
Menggunakan kerangka DI pihak ketiga membuat Anda tidak perlu menemukan kembali roda.
sumber