__construct( private UserRepository $repo, private PaymentGateway $pay, ) {} // コンテナが依存を注入 } // 使う側 ← newしない $svc = app(OrderService::class); $svc->createOrder(1, $items); // テスト: bind で差し替え $this->app->bind( PaymentGateway::class, fn() => new MockPayment() ); // Spring Boot(コンテナ経由で生成) @Service public class OrderService { public OrderService( UserRepository repo, PaymentGateway pay ) {} } // 単一コンストラクタ→自動注入 // 使う側 ← newしない @Autowired OrderService svc; // 注入される // テスト: @MockBean で差し替え @MockBean PaymentGateway gw; // Go(自分で組み立てる) func NewOrderService( repo UserRepository, pay PaymentGateway, noti Notifier, ) *OrderService { ... } // 使う側 ← 自分でnewする svc := NewOrderService( userRepo, payment, notifier, ) // テストも自分で渡す svc := NewOrderService( mockRepo, mockPay, mockNotif, ) Laravel / Spring Boot: フレームワークにDIコンテナ内蔵 → 注入も差し替えも簡単 Go: 標準ではDIコンテナなし → main.go等で手書き( or 生成)が基本 ※PHP, Javaのコードは参考程度にお願いします