Mengenal Spring Dependency Injection Framework — Bahasa Indonesia

Satya Syahputra
4 min readJun 9, 2019

--

https://banner2.kisspng.com/20180328/ace/kisspng-spring-framework-representational-state-transfer-j-spring-5abb1a637c6711.3394662515222114275096.jpg

Spring Framework merupakan Dependency Injection Framework, mengapa demikian? Karena Spring Framework pada dasarnya di desain yang dimana komponennya loosely coupled dan modular sehingga tingkat ketergantungan antar komponen pada String tidaklah tinggi yang membuat kelas mudah untuk diubah dalam bentuk(kelas) lain. Hal tersebut dapat kita lihat dari banyaknya projek pada halaman resmi Spring serta penggunaan Bean pada Spring.

Pada tulisan ini tidak menjelaskan secara lengkap, namun hanya akan menjelaskan beberapa hal yang perlu diketahui pada saat mengembangkan menggunakan Spring yaitu projek Spring Boot, konfigurasi menggunakan Java Config dan hanya happy flow saja.

Bean (@Component, @Repository, @Service, @Controller dan @RestController)

Bean ini merupakan instance pada suatu kelas yang kita buat, namun perlu menambahkan setidaknya anotasi @Component pada kelas atau turunannya seperti @Repository, @Service, @Controller dan @RestController. Tapi kali ini hanya akan menggunakan anotasi @Component saja sebagai contoh.

// file MusicImpl.java
@Component
public class MusicImpl {
....
}
// file Music.java
public interface Music {
....
}
// file PopMusic.java
@Component
public class PopMusic implements Music {
....
}

Pada kode diatas kelas MusicImpl &PopMusic akan dibuat bean pada Spring Application. Secara default setiap bean akan dibuat menjadi Singleton Pattern. Mengapa singleton? Karena dengan menggunakan singleton pattern memori yang digunakan untuk aplikasi menjadi lebih sedikit sehingga bisa menghemat banyak memori. Perlu diketahui Singleton yang dibuat oleh Spring Application berbeda dengan Gang of Four (GOF), yang mana singleton yang dibuat oleh spring hanya sebatas aplikasi spring saja sedangkan pada GOF dibuat pada JVM sehingga bila ada aplikasi lain tidak dapat membuat singleton yang sama.

Menentukan scope pada bean menggunakan @Scope

Contoh menentukan sebuah bean akan dibuat menjadi Singleton atau Prototype :

// Contoh Singleton
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class MusicImpl {
....
}
// Contoh Prototype
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MusicImpl {
....
}

Ingat! tanpa menambahkan anotasi @Scope, secara default scope yang akan digunakan adalah singleton.

Melakukan injeksi bean menggunakan @Autowired

// file MusicImpl.java
@Component
public class MusicImpl {
@Autowired
private Music music;

public String playMusic() {
return music.returnMusic();
}
}
// file Music.java
public interface Music {
String returnMusic();
}
// file PopMusic.java
@Component
public class PopMusic implements Music {
public String returnMusic() {
return "Play Pop Music";
}
}

Dari kode diatas pada kelas MusicImpl terdapat properti Music, yang mana kelas MusicImpl tidak akan bisa terbentuk tanpa terbentuknya Music. Hal ini disebut dependency, yang mana MusicImpl bergantung pada Music. Kemudian pada kelas PopMusic merupakan turunan Music, yang mana kelas Music merupakan interface sehingga PopMusic implements Music. Dengan demikian PopMusic dapat digunakan pada properti Music di kelas MusicImpl.

Oke, kemudian pada properti Music terdapat anotasi @Autowired yang digunakan untuk menginjeksi bean Music (yaitu PopMusic). Secara otomatis properti music akan berisikan objek singleton dari PopMusic.

Menggunakan bean dengan mendefinisikan nama bean pada @Component.

Bagaimana bila menggunakan Music yang lain? Oke mari lihat baris kode berikut :

// file RockMusic.java
@Component("rock")
public class RockMusic implements Music {
public String returnMusic() {
return "Play Rock Music";
}
}

Pada anotasi @Component terdapat nilai “rock”, dengan nilai string yang diberikan seperti potongan kode di atas maka bean yang pada kelas RockMusic akan bernama “rock”. Bagaimana cara menggunakannya? cukup mudah, yaitu seperti berikut :

// file MusicImpl.java
@Component
public class MusicImpl {
@Autowired
private Music rock;

public String playMusic() {
return rock.returnMusic();
}
}

Dengan menyesuaikan nama dari bean dan properti, secara otomatis bean yang terpasang pada properti pada contoh diatas merupakan kelas RockMusic. Selanjutnya pasti akan terlintas pertanyaan Apabila kita tidak memberikan nama pada komponen, apa nama default dari komponen? Nama default dari bean merupakan nama dengan camel case contoh untuk kelas PopMusic maka akan menjadi popMusic. Kemudian bagaimana caranya menggunakan PopMusic lagi? Cukup dengan mengubah nama properti yang kita gunakan menjadi popMusic.

Menggunakan bean dengan anotasi @Qualifier

Apabila kurang nyaman dengan menggunakan nama properti sesuai dengan nama bean. Anotasi @Qualifier menjadi solusi terbaik. Dengan menambahkan anotasi @Qualifier pada properti seperti berikut :

// file MusicImpl.java
@Component
public class MusicImpl {
@Autowired
@Qualifier("rock")
private Music music;

public String playMusic() {
return music.returnMusic();
}
}

Penggunaan anotasi @Primary

Selain itu bisa juga dengan menggunakan anotasi @Primary pada salah satu dari bean, contoh :

// file RockMusic.java
@Component
@Primary

public class RockMusic implements Music {
public String returnMusic() {
return "Play Rock Music";
}
}

Dengan memberikan anotasi @Primary ini, penggunaan definisi nama tidak lagi diperhatikan. Karena secara otomatis anotasi @Autowired akan menggunakan bean yang memiliki anotasi @Primary. Hal ini akan memprioritas utamakan selalu sehingga penyesuaian nama properti dengan bean atau penggunaan @Qualifier tidak berfungsi.

Sekian yang bisa dibagikan dari tulisan ini. Apabila ada masukan bisa berikan komentar dan bila tulisan ini bermanfaat jangan lupa memberikan claps 👏. Terima kasih, dadahh👋👋

--

--