@Injectについて自分のメモのために初心者が簡単にまとめたものになります。(もし間違ってる点等ありましたら是非教えていただきたいです)
コードのみではなかなか理解しづらいので例えながらまとめていこうと思います。
今回はコーヒーショップに例えながら説明していきます。
前提
コーヒーショップで働くバリスタがいます。
バリスタはコーヒーメーカーに依存(なければコーヒーを淹れられない)
コーヒーメーカーはコーヒー豆に依存(豆がなければコーヒーを作れない)
コーヒー豆は 仕入れ業者 に依存(業者がいないと豆が手に入らない)
これがいわゆる依存性になります。
@Injectを使用しない場合
バリスタがコーヒーメーカーからコーヒー豆まですべて一人で管理する状態
// 仕入れ業者(CoffeeSupplier)がコーヒー豆を提供する
class CoffeeSupplier {
public String provideBeans() {
return "新鮮なコーヒー豆";
}
}
// コーヒーメーカー(CoffeeMaker)がコーヒーを淹れる
class CoffeeMaker {
private final CoffeeSupplier supplier;
public CoffeeMaker() {
// CoffeeMaker が自分で仕入れ業者を作る(依存関係を自前で管理)
this.supplier = new CoffeeSupplier();
}
public void brew() {
System.out.println("コーヒーメーカー: " + supplier.provideBeans() + " を使ってコーヒーを淹れます。");
}
}
// コーヒーショップ(CoffeeShop)はバリスタの役割
public class CoffeeShop {
private final CoffeeMaker coffeeMaker;
public CoffeeShop() {
// CoffeeShop がすべての依存関係を自分で作る
this.coffeeMaker = new CoffeeMaker();
}
public void serveCoffee() {
System.out.println("コーヒーショップ: お客様にコーヒーを提供します。");
coffeeMaker.brew();
}
public static void main(String[] args) {
// コーヒーショップを作成してコーヒーを提供
CoffeeShop shop = new CoffeeShop();
shop.serveCoffee();
}
}
@Injectを使用した場合
コーヒーショップを 仕入れ業者と契約 して、バリスタが直接農園に行かずに済むようにしましょう。
バリスタは「仕入れ業者」から必要な材料を受け取るだけでよい。
バリスタは「どの業者か」は気にせず、コーヒー作りに専念できる。
import jakarta.inject.Inject;
import jakarta.enterprise.context.ApplicationScoped;
// 仕入れ業者(CoffeeSupplier)がコーヒー豆を提供する
@ApplicationScoped
class CoffeeSupplier {
public String provideBeans() {
return "新鮮なコーヒー豆";
}
}
// コーヒーメーカー(CoffeeMaker)がコーヒーを淹れる
@ApplicationScoped
class CoffeeMaker {
private final CoffeeSupplier supplier;
// 仕入れ業者を @Inject で受け取る
@Inject
public CoffeeMaker(CoffeeSupplier supplier) {
this.supplier = supplier;
}
public void brew() {
System.out.println("コーヒーメーカー: " + supplier.provideBeans() + " を使ってコーヒーを淹れます。");
}
}
// コーヒーショップ(CoffeeShop)はバリスタの役割
@ApplicationScoped
public class CoffeeShop {
private final CoffeeMaker coffeeMaker;
// @Inject を使って CoffeeMaker を受け取る
@Inject
public CoffeeShop(CoffeeMaker coffeeMaker) {
this.coffeeMaker = coffeeMaker;
}
public void serveCoffee() {
System.out.println("コーヒーショップ: お客様にコーヒーを提供します。");
coffeeMaker.brew();
}
}
メリット
少し長いコードになってしまいましたが、注目してほしいのは@Injcetを使用すると 「new」を用いることがないということです。つまり毎回バリスタがコーヒー豆の仕入れまで考える必要がなく、自分の仕事に専念できるのです。
ほかにもたくさんのメリットがあります(保守性・再利用性など)
結論
@Injectを用いることで、依存性の管理が柔軟に!
一つ一つのクラスの結合が弱くなり、自分の仕事に専念できるようになります!