spring 中的 bean 根据职责分为不同的作用范围,大致如下:

作用范围 描述
单例 默认的作用范围,一个容器中一个单例的实例对象只存在一个
原型 允许多个实例
请求 作用范围是一个 http 请求
会话 作用范围是一个 http 会话
应用 作用范围是一个 ServletContext
websocket 作用范围是一个 websocket

需要注意的地方

原型

对于作用范围为原型的 bean 容器只负责生命周期中实例化到初始化的回调,并不管理销毁,所以即使堆作用范围为原型的 bean 定义销毁时的回调也不会得到调用。

当一个原型被注入到多个单例中时,每个单例中的原型都是不同的对象,即原型在每次被注入时,将会初始化一个新的对象。

应用

应用的作用范围比单例更广,单例的作用范围是一个容器,而一个 spring 的应用中可能存在多个容器。

代理

当向大作用范围的 bean 中注入小作用范围的 bean 时,spring 一般使用代理实现。比如向一个单例 bean 中注入一个会话 bean 时,单例中的会话 bean 实际上是一个代理,这个代理接受单例对会话 bean 的调用,并调用代理内部的真正的会话 bean 返回结果。

在默认情况下,这个代理是使用 CGLIB 基础创建的。