Study
Play Framework

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.

Editor Latihan

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.