Spring 中 Bean 的作用域中的单例和多例

        在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实例的生命周期和可见性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值