Spring中Bean的作用域

前言

        在Spring框架中,我们将组成Web应用程序得主体与Spring IOC容器管理得实例对象,我们称为Bean,而Spring IOC 容器是对Bean实例得初始化、装配以及一些管理操作
        在Spring IOC容器中我们得Bean实例默认为单例,大多数情况下,我们需要不同得实例对象,譬如我们经常使用new操作符来构建不同得实例对象。因此Bean得作用域中提供了多种作用域

Bean得作用域

        需要对我们得Bean实例做相关修改时,可以通过bean节点中的scope属性来进行设定

singleton——单例(默认)

        当我们将bean得实例设置为singleton时,Spring IOC容器只会共享一个实例。当需要获取设置了该属性得bean实例时,只要id与class属性值相匹配时,就只会返回同一个bean实例
        我们得singleton属性值为单例(单例模式),也就是在创建IOC容器实例时我们容器中得bean节点都会实例化。不管是否使用,IOC容器都将会帮我们自动的进行实例化bean,此方式我们称为饿汉式。

<!--scope:bean作用域(单例);lazy-init:bean实例化时机(false[饿汉式])-->
<bean id="beanNewTest" class="com.spring.config.BeanNewTest" lazy-init="false" scope="singleton"/>

prototype——多例

        大家设想一下,若我们IOC容器中有几百上千得bean节点时,只要IOC容器进行实例化,都会对所有得bean实例化,但是我们不是所有得bean实例都会使用,这样会造成其他得bean实例占据资源,从而资源浪费,这种方式不太友好,往往我们只有当需要用的时候进行实例化,那么该如何解决呢?
        是否将当前得bean实例设置为单例或多利,我们可以通过lazy-init 属性来进行设置,属性值说明如下

属性(lazy-init )值含义
false容器加载时当前bean进行实例化(饿汉式)
true当我们需要使用bean实例,从IOC容器中调用时实例化(懒汉式)

        当我们将bean节点得作用域设置为prototype时,会导致我们每次调用该bean(注入其他bean中或调用getBean()方法)时,都会返回不同得bean实例。设置为prototype属性后它并不会与IOC容器实例就构建实例,而是当我们需要在使用该bean时才会创建实例,配置方式如下

<bean id="beanNewTest" class="com.spring.config.BeanNewTest" lazy-init="true" scope="prototype"/>

通过注解方式设置bean作用域

        可能大家和我一样比较偷懒的话,认为在配置文件中进行设定作用域比较麻烦时,就可以通过注解得方式,可以达到一样的效果,那么如何操作呐?
        只需要在我们对应得类头上加上@Scope注解就可以啦,那么下面为大家演示一样

@Data //包括get/set/toString/equals/hashCode等
@NoArgsConstructor //无参构造
@AllArgsConstructor //有参构造
//上面三个注解为lombok得相关注解
//@Scope 该注解将当前类设置为单例模式,及IOC容器实例化时就创建该对象
@Scope("singleton")
public class User {
    private int id;
    private String name;
    private String pwd;
    private Dog dog;
}

        是不是发现使用注解得方式很轻松啦,将bean得作用域设置为多例模式prototype这里就不演示啦,与上面一样,只需要将@Scope得内容修改一下就好

补充

        上面得两种方式:①singleton ②prototype 可以在普通得java项目上使用,还有其他三种属性只能在web应用程序上使用

属性值含义
request不同得HTTP请求将会产生对应不同得bean,并且该bean实例只能在对应得HttpRequest中有效,其他作用域无效
session不同得HTTP请求将会产生对应不同得bean,并且该bean实例只能在对应得HttpSession中有效,其他作用域无效
globalSession与session类似,不过该实现方式基于portlet web应用程序有效

         感谢大家的阅读,热爱分享的仓鼠,请大家多多指教,么么哒~~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被风吹过的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值