Mengenal Dependency Injection dan Contohnya Dalam Framework Spring


Dependency Injection (DI) adalah sebuah konsep dalam pemrograman yang membantu mengelola dependensi atau ketergantungan antar objek. DI bekerja dengan memasukkan atau "menginjeksikan" dependensi yang diperlukan oleh suatu objek dari luar, alih-alih membuat objek tersebut menciptakan atau mengelola dependensinya sendiri. Ini memudahkan pengelolaan kode dan membuat aplikasi lebih fleksibel, terstruktur, dan mudah diuji, karena setiap komponen tidak tergantung langsung pada implementasi spesifik komponen lain.

Dalam DI, biasanya ada tiga jenis teknik injeksi yang sering digunakan:

  1. Constructor Injection: Dependensi diberikan melalui konstruktor objek.
  2. Setter Injection: Dependensi disediakan melalui metode setter.
  3. Interface Injection: Objek menyediakan dependensinya melalui interface.

Sebagai contoh di Java dengan Spring Framework

@Service
public class RedisService {

private final RedisTemplate<String, Object> redisTemplate;

@Autowired
public RedisService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}

public void saveData(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

}

Di contoh ini, RedisTemplate adalah dependensi dari RedisService, dan RedisTemplatedisuntikkan ke dalam RedisService melalui konstruktor.

Inversion of Control (IoC)  dalam Dependency Injection

Inversion of Control (IoC) adalah konsep dalam pemrograman yang membuat kontrol atau kendali untuk membuat dan mengelola objek diberikan kepada pihak luar, biasanya sebuah framework atau container, alih-alih diatur sendiri oleh objek tersebut. Tujuan utamanya adalah untuk membuat kode lebih modular, fleksibel, dan mudah diubah atau diuji.

Cara kerjanya:

  • Tanpa IoC: Setiap objek bertanggung jawab untuk membuat atau mencari objek lain yang dibutuhkannya. Ini bisa membuat kode menjadi sulit diubah, karena satu objek "tergantung" secara langsung pada objek lainnya.

    Contoh sederhana:

public class RedisService {

private final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

public void saveData(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

}
  • Dengan IoC: Sebaliknya, IoC memungkinkan framework (seperti Spring) yang mengelola pembuatan dan pengaturan objek UserRepository. UserService tidak membuat UserRepository secara langsung, tetapi menerimanya dari luar (dalam hal ini dari IoC container atau DI framework).

    Contoh:

@Service
public class RedisService {

private final RedisTemplate<String, Object> redisTemplate;

@Autowired
public RedisService(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}

public void saveData(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}

}
Di sini, UserService tidak lagi membuat UserRepository sendiri. UserRepository disuntikkan atau diberikan dari luar (oleh IoC container), sehingga UserService lebih fleksibel. Jika ingin mengganti UserRepository, kita bisa melakukannya tanpa mengubah kode di UserService.

 

Inti dari IoC: Objek tidak lagi mengatur atau mengontrol sendiri komponennya, tetapi "dibantu" oleh framework atau container yang akan menyediakannya.

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Numpang Kerja Remote dari Bandung Digital Valley

Cara Decompile berkas Dex dan Apk Android