spring 中的 bean 根据职责分为不同的作用范围,大致如下:
作用范围 | 描述 |
---|---|
单例 | 默认的作用范围,一个容器中一个单例的实例对象只存在一个 |
原型 | 允许多个实例 |
请求 | 作用范围是一个 http 请求 |
会话 | 作用范围是一个 http 会话 |
应用 | 作用范围是一个 ServletContext |
websocket | 作用范围是一个 websocket |
需要注意的地方
原型
对于作用范围为原型的 bean 容器只负责生命周期中实例化到初始化的回调,并不管理销毁,所以即使堆作用范围为原型的 bean 定义销毁时的回调也不会得到调用。
当一个原型被注入到多个单例中时,每个单例中的原型都是不同的对象,即原型在每次被注入时,将会初始化一个新的对象。
应用
应用的作用范围比单例更广,单例的作用范围是一个容器,而一个 spring 的应用中可能存在多个容器。
代理
当向大作用范围的 bean 中注入小作用范围的 bean 时,spring 一般使用代理实现。比如向一个单例 bean 中注入一个会话 bean 时,单例中的会话 bean 实际上是一个代理,这个代理接受单例对会话 bean 的调用,并调用代理内部的真正的会话 bean 返回结果。
在默认情况下,这个代理是使用 CGLIB 基础创建的。