首頁 >Java >java教程 >魔法範圍:Spring 如何組織 beans

魔法範圍:Spring 如何組織 beans

Linda Hamilton
Linda Hamilton原創
2025-01-12 22:05:42923瀏覽

熟練而勤奮的助手 - beans - 在 Spring 工作室工作。他們每個人都被賦予了自己獨特的任務:有的創造玩具,有的分類糖果,有的種植鮮豔的花朵。

為確保研討會工作有序高效,針對垃圾箱 - 範圍制定了明確的規則。這些規則決定了 Bean 可以存在多長時間以及可以同時建立多少個同類實例。正是有了這些神奇的框架,研討會得以順利、可靠地進行。

原型:刺蝟貝克

Волшебные скоупы: Как Spring организует работу бинов
每當有人點派時,刺蝟麵包師都會用獨特的原料製作新的派。

刺蝟:「每個人都想要自己的口味!這就是為什麼我為每個訂單製作一個新鮮的餡餅。」

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

這就是作用域 prototype 在 Spring 中的工作方式:每次請求新物件時,都會建立該 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請求建立一個bean。一旦請求完成,bean 就會被銷毀。

使用範例:
想像一下,在 Web 應用程式中,您有一個用於收集使用者資料的元件:

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

每個使用者請求都被分配一個唯一的籃子,它僅作為處理 HTTP 請求的一部分而「存在」。請求完成後,bean 將被刪除,釋放記憶體。

實際開發中Prototype和Request的比較:

原型:用於每次呼叫都需要唯一實例的任務,例如測試、產生唯一資料、處理獨立任務。
請求:在 Web 應用程式中很有用,可在使用者請求之間提供資料隔離。例如,購物車、身份驗證資料或臨時令牌。
方法差異:

原型可以在任何上下文中使用,包括控制台應用程式。
請求嚴格綁定到 Web 上下文,因為它依賴 HTTP 請求。


Singleton:建造者鮑勃

Волшебные скоупы: Как Spring организует работу бинов
建造者鮑伯在森林裡工作,為每個人建造一座水壩。他說:

「我孤單一人,我會建造任何東西,無論有多少動物來找我!」

這表示我們將始終擁有所有客戶端存取的相同物件實例。每次都是同一個鮑伯來。他不需要被克隆或消失。於是他日復一日地工作。

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

Singleton 是 Spring 中預設的作用域。 Bean 的一個實例是在應用程式的整個運行期間建立的。當物件必須是所有應用程式元件之間的共用資源時,請使用此 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("Пеку пирог!");
    }
}

範圍 application 表示該 bean 為整個應用程式建立一次,但與單例不同,它僅在 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 Всё время работы приложения Глобальные настройки, кэш на уровне приложения
單例 應用程式運行的所有時間 日誌記錄、使用資料庫 原型 每次呼叫新物件 報告生成、測試 請求 一個 HTTP 請求 購物車、臨時資料 會議 整個 HTTP 使用者會話 授權資料、使用者設定 申請 應用程式運行的所有時間 全域設置,應用級快取 表>

何時使用什麼?
Singleton - 用於共享、不變的資源。
原型 - 用於孤立的任務、獨特的數據。
請求 - 在一個請求中取得臨時資料。
會話 - 用於需要在相同使用者的請求之間儲存的資料。
應用程式 - 用於所有使用者使用的全域資料。

以上是魔法範圍:Spring 如何組織 beans的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn