Pada kesempatan ini saya akan berbagi pengalaman tentang pertanyaan interview dari klien saya dari Australia yaitu tentang konsep Dependency Injection pada Spring. What do you know about Dependency Injection ? kira-kira seperti itu pertanyaan yang diajukan oleh Mr. Denny.

Okey, let's to the point. Berdasarkan hasil penelusuran dari berbagai referensi saya mendapatkan jawaban. Dependency Injection (DI) adalah suatu teknik untuk memasukkan sebuah Object ke dalam Object lain yang membutuhkan. Object yang dimasukkan tersebut biasanya berupa class. Sehingga bisa dikatakan juga bahwa Dependency Injection adalah proses memasukkan suatu class ke dalam class lain yang membutuhkan. Untuk lebih jelasnya mari kita buat contoh penggunaan DI dalam pemrograman Java.

Langkah pertama adalah dengan membuat class yang akan di-inject oleh class lain. Bisa kita sebut juga dengan client class, yaitu class yang memiliki ketergantungan dengan class lain. Contoh client class yang akan saya buat adalah class HitungLuas.

Langkah kedua adalah dengan membuat service class PersegiPanjang yang merupakan dependency dari class HitungLuas.

Langkah terakhir adalah dengan membuat injector class dimana class PersegiPanjang akan dimasukkan (di-inject)  ke class HitungLuas. Pada class injector dimasukkan juga parameter input yang dibutuhkan seperti nilai Panjang dan Lebar.


Setelah program di-running maka outputnya adalah hasil dari perhitungan luas persegi panjang.

 Luas Persegi Panjang : 48

Ingin coba yang lebih kompleks ?? Tenang akan saya bagi gratis contohnya.

Berdasarkan pengalaman project contoh yang lebih kompleks pemakaian Dependency Injection adalah untuk proses kirim notifikasi. Sebagai contoh adalah method kirim notif melalui email.



Pada Class EmailServiceNotification dibuat logik code yang berfungsi untuk mengirimkan notif email ke penerima dan class tersebut akan di-call dari class lain yaitu class EmailApplication.



Kemudian melului class TestSendNotif program di-running.



Sekilas melihat hasil running program tidak ada masalah. Tetapi ketika kita cermati lebih detail logic code di atas memiliki masalah dengan limitasi.

  • Class EmailApplication bertugas untuk melakukan inisialisasi class EmailServiceNotification dan kemudian menggunakan service tersebut. Hal ini menyebabkan ketergantungan pada class EmailServiceNotification. Jika kita ingin beralih ke pengembangan lain di masa mendatang maka setiap ada perubahan code  pada class EmailServiceNotification maka pada class EmailApplication juga harus dilakukan perubahan.Tentunya masalah ini akan membuat aplikasi kita sulit untuk dikembangkan dan jika EmailServiceNotification digunakan di banyak class maka akan lebih sulit lagi.
  • Jika kita ingin memperluas aplikasi kita untuk menyediakan fitur notif tambahan, seperti SMS atau notif WhatsApp, maka kita perlu menulis code tambahan untuk itu. Sehingga akan terjadi perubahan kode di class aplikasi dan di class client juga.
  • Pengujian aplikasi akan sangat sulit karena class kita langsung membuat instance untuk notif email. Akan sangat menyusahkan jika kita membuat semua mock object pada class test.
Sekarang mari kita gunakan konsep Dependency Injection untuk menyelesaikan masalah di atas.

Langkah pertama mari kita buat class interface NotificationService.


Selanjutnya kita buat class implementasi dari interface NotificationService yaitu class EmailServiceImpl dan SMSServiceImpl




Service dependency injection telah siap. Selanjutnya kita buat interface class bernama Customer.



Implementasi dari class Customer adalah sebagai berikut



Class MyNotifApplication hanya menggunakan NotificationService tetapi tidak melakukan inisilaisaisi service.Maka langkah selanjutnya adalah membuat class dependency injector untuk meminimalisasi service dan customer. Misalkan nama class nya adalah NotifServiceInjector.



Okay, sekarang setiap service akan memiliki class injector seperti di bawah ini.





Sekarang kita bisa buat class utama untuk menjalankan service notif di atas.


Seperti yang kita lihat bahwa pada class DemoNotifTest hanya bertanggung jawab untuk menggunakan class service. Kelas service dibuat di injektor. Sehingga jika nanti aplikasi kita berkembang luas dan mengharuskan untuk integrasi notif dengan facebook, kita hanya perlu menulis class service dan class injektor saja.

Dari penjelasan di atas maka dapat disimpulkan bahwa implementasi Dependency Injection dapat memecahkan masalah dengan dependensi hard-coded dan dapat membantu dalam membuat aplikasi yang lebih fleksibel dan mudah diperluas.