Dependency Injection (Guice Bawaan Play)
Penjelasan
Play menggunakan Google Guice sebagai dependency injection framework bawaan. Alih-alih controller membuat instance service atau repository secara manual, dependency tersebut dideklarasikan sebagai parameter constructor dengan anotasi `@Inject()`, dan Guice yang bertanggung jawab menyediakan instance yang sesuai saat runtime — memudahkan testing (mudah diganti dengan mock) dan memisahkan tanggung jawab pembuatan objek dari logic bisnis. Untuk interface yang punya banyak implementasi, binding-nya didefinisikan secara eksplisit lewat class `Module` yang didaftarkan di `application.conf`, memetakan interface ke implementasi konkret yang harus dipakai Guice. Untuk kasus sederhana (satu implementasi per class), anotasi `@Singleton` di class sudah cukup tanpa perlu Module tambahan.
Contoh Konsep
package services
import javax.inject._
@Singleton
class ProdukService {
def cariSemua(): List[String] = List("Kopi", "Teh", "Susu")
}
package controllers
import javax.inject._
import play.api.mvc._
import services.ProdukService
@Singleton
class ProdukController @Inject()(
val controllerComponents: ControllerComponents,
produkService: ProdukService
) extends BaseController {
def daftar(): Action[AnyContent] = Action {
Ok(produkService.cariSemua().mkString(", "))
}
}
Praktikum
Buat class KategoriService dengan method daftarKategori() yang mengembalikan List[String], lalu suntikkan ke KategoriController lewat constructor injection.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Tandai service yang stateless dan aman dibagi sebagai @Singleton — ini mencegah Guice membuat instance baru setiap kali di-inject, menghemat memori dan menghindari inisialisasi berulang yang tidak perlu.