Bean的作用域

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
为什么Spring容器创建的Bean默认是单例的

Snipaste_2022-12-20_22-46-34.jpg Spring容器调用配置方法完成Bean的创建之后,Bean就缓存在Spring容器里。之后每次调用同一配置方法创建Bean,Spring容器只会返回缓存在Spring容器里的Bean,不再创建新的Bean。这意味着同一配置方法在同一Spring容器里无论被调用了多少次,都只会返回同一实例的Bean。因此,Spring容器创建的Bean默认是单例的。
在Web开发中为什么有的类需要是单例的
因为在Web开发中诸如控制器之类的Bean是无状态的。无论哪个用户发来请求,都能使用同一控制器实例处理,根本就不需要再创建新的控制器实例。然而对于一些类,比如数据模型类,每个请求所产生或获取的数据都是不一样的。这意味着这样的类是有状态的。把这些有状态的类创建为单例的显然不妥。我们通常选择创建这些类的域对象(Domain Object),通过new关键字在Bean的方法中创建这些类的实例。因此,在Web开发中,我们往往只需告诉Spring容器创建单例的Bean。
Spring容器还需支持创建具有其它作用域的Bean

Snipaste_2022-12-20_22-49-33.jpg

  1. 原型(Prototype):Spring容器每次调用配置方法创建Bean时都会重新创建Bean的实例,调用几次就创建几个实例。
  2. 请求(Request):请求指的是Web请求,只有Web相关的Spring容器(比如XmlWebApplicationContext)才支持请求作用域。指定作用域为请求后,同一配置方法在同一Web请求里无论被调用了多少次,都只会创建一个Bean的实例。
  3. 会话(Session):会话指的是Web会话,只有Web相关的Spring容器(比如XmlWebApplicationContext)才支持会话作用域。指定作用域为会话后,同一配置方法在同一Web会话里无论被调用了多少次,都只会创建一个Bean的实例。