Musim Semi - Injeksi Ketergantungan

Setiap aplikasi berbasis Java memiliki beberapa objek yang bekerja sama untuk menyajikan apa yang dilihat pengguna akhir sebagai aplikasi yang berfungsi. Saat menulis aplikasi Java yang kompleks, kelas aplikasi harus sebebas mungkin dari kelas Java lainnya untuk meningkatkan kemungkinan menggunakan kembali kelas-kelas ini dan mengujinya secara independen dari kelas lain saat pengujian unit. Dependency Injection (atau kadang disebut wiring) membantu dalam merekatkan kelas-kelas ini bersama-sama dan pada saat yang sama menjaganya tetap independen.

Pertimbangkan Anda memiliki aplikasi yang memiliki komponen editor teks dan Anda ingin memberikan pemeriksa ejaan. Kode standar Anda akan terlihat seperti ini -

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

Apa yang kita lakukan di sini adalah, membuat ketergantungan antara TextEditor dan Pemeriksa Ejaan. Dalam skenario inversi kendali, kami akan melakukan sesuatu seperti ini -

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

Di sini, TextEditor tidak perlu mengkhawatirkan implementasi SpellChecker. Pemeriksa Ejaan akan diimplementasikan secara independen dan akan diberikan ke TextEditor pada saat Instansiasi TextEditor. Seluruh prosedur ini dikendalikan oleh Kerangka Pegas.

Di sini, kami telah menghapus kontrol total dari TextEditor dan menyimpannya di tempat lain (yaitu file konfigurasi XML) dan ketergantungan (yaitu kelas SpellChecker) dimasukkan ke dalam kelas TextEditor melalui Class Constructor. Jadi aliran kontrol telah "dibalik" oleh Dependency Injection (DI) karena Anda telah mendelegasikan ketergantungan secara efektif ke beberapa sistem eksternal.

Metode kedua untuk menyuntikkan ketergantungan adalah melalui Setter Methodsdari kelas TextEditor di mana kita akan membuat instance SpellChecker. Instance ini akan digunakan untuk memanggil metode penyetel untuk menginisialisasi properti TextEditor.

Dengan demikian, DI ada dalam dua varian utama dan dua sub-bab berikut akan membahas keduanya dengan contoh -

Sr.No. Jenis & Deskripsi Injeksi Ketergantungan
1 Injeksi ketergantungan berbasis konstruktor

DI berbasis konstruktor dicapai ketika wadah memanggil konstruktor kelas dengan sejumlah argumen, masing-masing mewakili ketergantungan pada kelas lain.

2 Injeksi ketergantungan berbasis penyetel

DI berbasis penyetel diselesaikan dengan metode penyetel pemanggil kontainer pada kacang Anda setelah memanggil konstruktor tanpa argumen atau metode pabrik statis tanpa argumen untuk membuat instance kacang Anda.

Anda dapat mencampur keduanya, DI berbasis Konstruktor dan berbasis Setter tetapi merupakan aturan praktis yang baik untuk menggunakan argumen konstruktor untuk dependensi wajib dan penyetel untuk dependensi opsional.

Kode lebih bersih dengan prinsip DI dan decoupling lebih efektif ketika objek dilengkapi dengan dependensinya. Objek tidak mencari dependensinya dan tidak mengetahui lokasi atau kelas dependensinya, melainkan semuanya diurus oleh Spring Framework.