0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

@Injectって結局何? 例えながら理解する

Last updated at Posted at 2025-03-03

@Injectについて自分のメモのために初心者が簡単にまとめたものになります。(もし間違ってる点等ありましたら是非教えていただきたいです)
コードのみではなかなか理解しづらいので例えながらまとめていこうと思います。
今回はコーヒーショップに例えながら説明していきます。

前提

コーヒーショップで働くバリスタがいます。
バリスタはコーヒーメーカーに依存(なければコーヒーを淹れられない)
コーヒーメーカーはコーヒー豆に依存(豆がなければコーヒーを作れない)
コーヒー豆は 仕入れ業者 に依存(業者がいないと豆が手に入らない)
これがいわゆる依存性になります。

@Injectを使用しない場合

バリスタがコーヒーメーカーからコーヒー豆まですべて一人で管理する状態

CoffeeShop.java
// 仕入れ業者(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を使用した場合

コーヒーショップを 仕入れ業者と契約 して、バリスタが直接農園に行かずに済むようにしましょう。

バリスタは「仕入れ業者」から必要な材料を受け取るだけでよい。
バリスタは「どの業者か」は気にせず、コーヒー作りに専念できる。

CoffeeShop.java
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を用いることで、依存性の管理が柔軟に!
一つ一つのクラスの結合が弱くなり、自分の仕事に専念できるようになります!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?