ホームページ >Java >&#&チュートリアル >マジック スコープ: Spring が Bean を整理する方法

マジック スコープ: Spring が Bean を整理する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-12 22:05:42923ブラウズ

春のワークショップでは、熟練した勤勉なアシスタントである豆が働いていました。それぞれに独自の仕事が与えられました。ある者はおもちゃを作り、ある者はキャンディーを分類し、ある者は鮮やかな花を育てました。

ワークショップの作業が秩序正しく効率的に行われるようにするために、ゴミ箱 - スコープ について明確なルールが確立されました。これらのルールにより、Bean が存在できる期間と、同じ種類のインスタンスを同時に作成できる数が決まりました。これらの魔法のフレームワークのおかげで、ワークショップはスムーズかつ確実に進行しました。

原型製作:ハリネズミベイカー

Волшебные скоупы: Как Spring организует работу бинов
誰かがパイを注文するたびに、ハリネズミのパン屋はユニークな材料を使って新しいパイを作ります。

ハリネズミ:「誰もが自分の味を望んでいます。だから私は注文ごとに焼きたてのパイを作ります。」

@Component
@Scope("prototype")
public class Hedgehog {
    public void bakePie() {
        System.out.println("Пеку пирог!");
    }
}

これは Spring でスコープ prototype がどのように機能するかです。新しいオブジェクトがリクエストされるたびに、Bean の一意のインスタンスが作成されます。これは、用途ごとにロジックを分離する必要がある場合に便利です。

例:

アプリケーションには、各ユーザーのレポートを生成する Bean があります。

@Component
@Scope("prototype")
public class ReportGenerator {
    public Report generate(String userData) {
        // Генерация уникального отчета
        return new Report(userData);
    }
}

context.getBean(ReportGenerator.class) を呼び出すたびに、新しいインスタンスが作成されます。これは、マルチユーザー システムで固有のデータを処理する場合に便利です。


リクエスト:キャロットバニー

Волшебные скоупы: Как Spring организует работу бинов
調剤ウサギはアシスタントに次のように説明します。

「開拓地に来る客ごとに、私はニンジンを集めます。しかし、客が去るとすぐに、かごは私に戻ってきます。」

@Component
@Scope("prototype")
public class Hedgehog {
    public void bakePie() {
        System.out.println("Пеку пирог!");
    }
}

Spring の

Request スコープは、HTTP リクエストごとに 1 つの Bean が作成されることを意味します。リクエストが完了すると、Bean は破棄されます。

使用例:
Web アプリケーションにユーザー データを収集するコンポーネントがあると想像してください。

@Component
@Scope("prototype")
public class ReportGenerator {
    public Report generate(String userData) {
        // Генерация уникального отчета
        return new Report(userData);
    }
}

各ユーザー リクエストには固有のバスケットが割り当てられ、HTTP リクエストの処理の一部としてのみ「存在」します。リクエストが完了すると、Bean が削除され、メモリが解放されます。

実際の開発におけるプロトタイプとリクエストの比較:

プロトタイプ: テスト、一意のデータの生成、分離されたタスクの処理など、呼び出しごとに一意のインスタンスを必要とするタスクに使用されます。
リクエスト: Web アプリケーションで、ユーザーのリクエスト間でデータを分離するのに役立ちます。たとえば、ショッピング カート、認証データ、一時トークンなどです。
アプローチの違い:

プロトタイプは、コンソール アプリケーションを含むあらゆるコンテキストで使用できます。
リクエストは HTTP リクエストに依存するため、Web コンテキストに厳密にバインドされます。


シングルトン: ボブ・ザ・ビルダー

Волшебные скоупы: Как Spring организует работу бинов
ボブ・ザ・ビルダーは森で働き、みんなのためにダムを建設します。彼はこう言います:

「私は一人です、そして、どんなにたくさんの動物が私のところに来ても、私は何でも作ります!」

これは、すべてのクライアントがアクセスするオブジェクトの同じインスタンスが常に存在することを意味します。そして毎回同じボブが来ます。彼はクローンを作成したり、失踪したりする必要はありませんでした。それで彼は来る日も来る日も働きました。

@Component
@Scope("prototype")
public class Hedgehog {
    public void bakePie() {
        System.out.println("Пеку пирог!");
    }
}

Singleton は Spring のデフォルトのスコープです。 Bean の 1 つのインスタンスは、アプリケーションの全期間にわたって作成されます。この Bean は、オブジェクトがすべてのアプリケーション コンポーネント間で共有リソースである必要がある場合に使用されます。

使用例:
ロギングコンポーネントがあるとします:

@Component
@Scope("prototype")
public class ReportGenerator {
    public Report generate(String userData) {
        // Генерация уникального отчета
        return new Report(userData);
    }
}

この Bean は一度作成されると、すべてのアプリケーション コンポーネントがそれを使用してログを記録します。これは効率的でメモリを節約できます。

アプリケーション:

  • ロギング
  • 接続プールを介したデータベースの操作
  • キャッシュを管理する

セッション: ハニーベア

Волшебные скоупы: Как Spring организует работу бинов
小さなクマは、家に来るすべての客のために蜂蜜を調理します。彼はこう言います:

「あなたが私を訪問している間、私はあなたのハニーポットの世話をします。しかし、あなたが去るとすぐに、あなたのハニーポットは消えてしまいます。」

@Component
@Scope("request")
public class Rabbit {
    public void giveCarrot() {
        System.out.println("Вот твоя морковка!");
    }
}

Spring のセッション スコープは、ユーザーの HTTP セッションが続く限り Bean が存在することを意味します。

技術的な説明:
このスコープは、Web アプリケーションでオブジェクトを特定のユーザー セッションにバインドするために使用されます。セッションが終了すると、Bean は破棄されます。

使用例:
ユーザー認証データを保存するコンポーネントがあると想像してください:

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserCart {
    private List<Item> items = new ArrayList<>();

    public void addItem(Item item) {
        items.add(item);
    }

    public List<Item> getItems() {
        return items;
    }
}

この Bean は、セッションが続く限り各ユーザーに対して作成されます。

アプリケーション:

  • ユーザーデータの保存 (認可、設定など)
  • セッショントークン管理

アプリケーション: フィリン・フィル

フクロウのフィルは毎晩森の住人たち全員におとぎ話を聞かせます。彼はこう言います:

「私のおとぎ話は森全体で唯一のものです。みんなが私の話を聞きに来ます、そしてみんなには十分です!」

@Component
@Scope("prototype")
public class Hedgehog {
    public void bakePie() {
        System.out.println("Пеку пирог!");
    }
}

スコープ アプリケーション は、Bean がアプリケーション全体に対して 1 回作成されることを意味しますが、Web アプリケーションのコンテキストでのみ使用されるという点でシングルトンとは異なります。

このスコープはシングルトンに似ていますが、Web コンテキストによって制御されます。これは、アプリケーション全体でアクセスできる必要があるコンポーネントに使用されます。

使用例:
たとえば、グローバル設定を保存するための Bean:

@Component
@Scope("prototype")
public class ReportGenerator {
    public Report generate(String userData) {
        // Генерация уникального отчета
        return new Report(userData);
    }
}

この Bean は一度作成されると、誰でも利用できます。

アプリケーション:

  • アプリケーション構成
  • グローバル設定
  • すべてのユーザーが共有するデータキャッシュ

すべての Spring スコープの比較

範囲 ライフサイクル 使用例
Scope Жизненный цикл Пример использования
Singleton Всё время работы приложения Логирование, работа с базами данных
Prototype Новый объект при каждом вызове Генерация отчётов, тестирование
Request Один HTTP-запрос Корзина покупок, временные данные
Session Вся HTTP-сессия пользователя Данные авторизации, настройки пользователя
Application Всё время работы приложения Глобальные настройки, кэш на уровне приложения
シングルトン アプリケーションが実行されている間ずっと ロギング、データベースの操作 プロトタイプ 呼び出しごとに新しいオブジェクト レポートの生成、テスト リクエスト 1 つの HTTP リクエスト ショッピング カート、一時データ セッション HTTP ユーザー セッション全体 認証データ、ユーザー設定 アプリケーション アプリケーションが実行されている間ずっと グローバル設定、アプリケーションレベルのキャッシュ テーブル>

いつ何を使用しますか?
シングルトン - 変更されない共有リソース用。
プロトタイプ - 孤立したタスク、固有のデータ用。
リクエスト - 1 つのリクエスト内の一時データ。
セッション - 同じユーザーのリクエスト間で保存する必要があるデータ用。
アプリケーション - すべてのユーザーが使用するグローバル データ用。

以上がマジック スコープ: Spring が Bean を整理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。