魔法範圍:Spring 如何組織 beans
熟練而勤奮的助手 - beans - 在 Spring 工作室工作。他們每個人都被賦予了自己獨特的任務:有的創造玩具,有的分類糖果,有的種植鮮豔的花朵。
為確保研討會工作有序高效,針對垃圾箱 - 範圍制定了明確的規則。這些規則決定了 Bean 可以存在多長時間以及可以同時建立多少個同類實例。正是有了這些神奇的框架,研討會得以順利、可靠地進行。
原型:刺蝟貝克
每當有人點派時,刺蝟麵包師都會用獨特的原料製作新的派。
刺蝟:「每個人都想要自己的口味!這就是為什麼我為每個訂單製作一個新鮮的餡餅。」
@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) 都會建立一個新實例。這對於在多用戶系統中處理獨特的資料很方便。
請求:胡蘿蔔兔子
配藥兔子向他的助手解釋:
「對於每一位來到空地的客人,我都會收集胡蘿蔔。但一旦客人離開,籃子就會回到我身邊。」
@Component @Scope("prototype") public class Hedgehog { public void bakePie() { System.out.println("Пеку пирог!"); } }
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:建造者鮑勃
建造者鮑伯在森林裡工作,為每個人建造一座水壩。他說:
「我孤單一人,我會建造任何東西,無論有多少動物來找我!」
這表示我們將始終擁有所有客戶端存取的相同物件實例。每次都是同一個鮑伯來。他不需要被克隆或消失。於是他日復一日地工作。
@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 會建立一次,所有應用程式元件都使用它來記錄日誌。這樣既有效率又節省內存。
申請:
- 記錄
- 透過連線池使用資料庫
- 管理快取
會議:親愛的熊
小熊為每一位來到他家的客人煮蜂蜜。他說:
「當你來看我的時候,我會照顧你的蜜罐。但是一旦你離開,你的蜜罐就消失了。」
@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 | Всё время работы приложения | Глобальные настройки, кэш на уровне приложения |
何時使用什麼?
Singleton - 用於共享、不變的資源。
原型 - 用於孤立的任務、獨特的數據。
請求 - 在一個請求中取得臨時資料。
會話 - 用於需要在相同使用者的請求之間儲存的資料。
應用程式 - 用於所有使用者使用的全域資料。
以上是魔法範圍:Spring 如何組織 beans的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...
