在Spring框架中,Bean的作用域(Scope)定义了Bean实例的创建和共享方式。其中,单例(Singleton)和多例(Prototype)是两种最基本的作用域。
单例(Singleton)
定义:在Spring容器中,单例Bean在整个容器的生命周期内只会存在一个共享的实例。无论有多少次请求该Bean,容器都会返回同一个实例。
配置方式:
在XML配置文件中,可以通过设置<bean>
标签的scope
属性为singleton
来指定Bean为单例作用域。例如:<bean id="myBean" class="com.example.MyBean" scope="singleton"/>
。在Java配置类中,可以使用@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
注解(但通常省略,因为单例是默认作用域)或直接在@Bean
方法上不做特殊配置(因为单例是默认作用域)。
特点
1、节省内存:因为只创建一个实例,所以内存开销较小。
2、线程安全:如果Bean是无状态的(即不保存任何请求或会话特有的数据),那么它是线程安全的。
3、适用于无状态的服务层组件,如Service和DAO层对象。
多例(Prototype)
定义:在Spring容器中,多例Bean每次被请求时都会创建一个新的实例。即每次通过getBean()
方法或依赖注入请求该Bean时,都会返回一个新的实例。
配置方式:
在XML配置文件中,可以通过设置<bean>
标签的scope
属性为prototype
来指定Bean为多例作用域。例如:<bean id="myBean" class="com.example.MyBean" scope="prototype"/>
。在Java配置类中,可以使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
注解来指定Bean为多例作用域。
特点:
每次请求都会创建新实例,所以内存开销较大。适用于有状态或需要保持独立数据的Bean,如Action层对象。开发者需要自行管理Bean的生命周期,包括初始化和销毁。
注意事项:
1、单例Bean在容器启动时就会被实例化,并缓存起来。而多例Bean则是在每次请求时才会被实例化。
2、对于单例Bean,如果其依赖了多例Bean,那么每次注入到单例Bean中的多例Bean实例都将是相同的(即在单例Bean初始化时注入的那个实例),除非使用代理或其他技术来实现每次注入时都获得新的多例Bean实例。
3、在Web应用程序中,Spring还提供了其他作用域,如request
(每次HTTP请求创建一个新的Bean实例)、session
(每个HTTP会话创建一个新的Bean实例)和globalSession
(在Portlet环境中,多个会话之间共享的Bean实例)。这些作用域主要用于Web应用程序中,以控制Bean实例的生命周期和可见性。