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:
- Constructor Injection: Dependensi diberikan melalui konstruktor objek.
- Setter Injection: Dependensi disediakan melalui metode setter.
- 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 membuatUserRepository
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 membuatUserRepository
sendiri.UserRepository
disuntikkan atau diberikan dari luar (oleh IoC container), sehinggaUserService
lebih fleksibel. Jika ingin menggantiUserRepository
, kita bisa melakukannya tanpa mengubah kode diUserService
.
Inti dari IoC: Objek tidak lagi mengatur atau mengontrol sendiri komponennya, tetapi "dibantu" oleh framework atau container yang akan menyediakannya.
Comments
Post a Comment