熟練而勤奮的助手 - 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("Пеку пирог!"); } }Spring中的
Request範圍意味著為每個HTTP請求建立一個bean。一旦請求完成,bean 就會被銷毀。
使用範例:
想像一下,在 Web 應用程式中,您有一個用於收集使用者資料的元件:
@Component @Scope("prototype") public class ReportGenerator { public Report generate(String userData) { // Генерация уникального отчета return new Report(userData); } }
每個使用者請求都被分配一個唯一的籃子,它僅作為處理 HTTP 請求的一部分而「存在」。請求完成後,bean 將被刪除,釋放記憶體。
原型:用於每次呼叫都需要唯一實例的任務,例如測試、產生唯一資料、處理獨立任務。
請求:在 Web 應用程式中很有用,可在使用者請求之間提供資料隔離。例如,購物車、身份驗證資料或臨時令牌。
方法差異:
原型可以在任何上下文中使用,包括控制台應用程式。
請求嚴格綁定到 Web 上下文,因為它依賴 HTTP 請求。
建造者鮑伯在森林裡工作,為每個人建造一座水壩。他說:
「我孤單一人,我會建造任何東西,無論有多少動物來找我!」
這表示我們將始終擁有所有客戶端存取的相同物件實例。每次都是同一個鮑伯來。他不需要被克隆或消失。於是他日復一日地工作。
@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 創建一次,可供所有人使用。
申請:
Scope | Жизненный цикл | Пример использования |
---|---|---|
Singleton | Всё время работы приложения | Логирование, работа с базами данных |
Prototype | Новый объект при каждом вызове | Генерация отчётов, тестирование |
Request | Один HTTP-запрос | Корзина покупок, временные данные |
Session | Вся HTTP-сессия пользователя | Данные авторизации, настройки пользователя |
Application | Всё время работы приложения | Глобальные настройки, кэш на уровне приложения |
何時使用什麼?
Singleton - 用於共享、不變的資源。
原型 - 用於孤立的任務、獨特的數據。
請求 - 在一個請求中取得臨時資料。
會話 - 用於需要在相同使用者的請求之間儲存的資料。
應用程式 - 用於所有使用者使用的全域資料。
以上是魔法範圍:Spring 如何組織 beans的詳細內容。更多資訊請關注PHP中文網其他相關文章!