熟练而勤奋的助手 - 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中文网其他相关文章!