Bean的6种作用域是什么?如何使用?

目录

前言

1.Bean的作用域

2.作用域类型

2.1、singleton

2.2、prototype

2.3、request

2.4、session

2.5、application

2.6、websocket

3、设置作用域

3.1设置方法

3.2、对比两种设置方式

小结


前言


        Bean对象在Spring的IoC容器中是重要的资源,那么你知道它的作用域是什么吗?你会使用吗?让我们一起来看看~


 

1.Bean的作用域


        我们知道程序中变量的可用范围叫做变量的作用域,那么Bean在Spring中又是IOC容器的重要资源,他的作用域是什么?Bean的作用域就是指Bean在Spring整个框架中的某种行为模式。例如singleton单例作用域,就表示Bean在整个Spring中只有一份,是全局共享的,当有人修改这个值后,那么其他人再读取到的便是修改后的值。

举个栗子,例如在Spring中定义了一个单例Bean对象student,如下:

@Component
public class StudentComponent {

    @Bean
    public Student student1() {
        Student stu = new Student();
        stu.setId(1);
        stu.setName("林俊杰");
        return stu;
    }

}

然后在Modify类中通过setName修改了Student,如下代码:

@Controller
public class Modify {

    @Autowired
    private Student student;

    public Student modifyStudent() {
        student.setName("周杰伦");
        return student;
    }

}

最后在Read类中获取Student对象,如下代码:

@Controller
public class Read {

    @Autowired
    private Student student;

    public Student readStudent() {
        Student stu = student;
        return stu;
    }

}

这时我们调用Read类中的readStudent方法就会发现,Student类中原本的name = "林俊杰",变成了“周杰伦”,这就说明Bean对象默认就是单例作用域,在任何地方一旦修改了该单例对象,随后再访问这个对象的时候就是修改之后的对象。

2.作用域类型


        Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作⽤域,作用域类型有如下6种,其中后两种只做了解

  1. singleton:单例作用域(默认作用域);
  2. prototype:原型作用域(多例模式);
  3. request:请求作用域;
  4. session:会话作用域(类似多线程中的ThreadLocal);
  5. application:全局作用域(了解即可);
  6. websocket:HTTP WebSocket 作⽤域(了解即可)。

注意:在Spring中只有前两种适用,后四种状态是在Spring MVC中适用。

2.1、singleton

  • 解释:该作用下的Bean在IOC容器中只有一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象。
  • 适用场景:该Bean的属性状态不需要更新。
  • Ps:Spring默认选择该作用域

2.2、prototype

  • 解释:每次都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。
  • 适用场景:该Bean的属性状态需要不断更新。

2.3、request

  • 解释:每次Http请求都会创建新的Bean实例,类似prototype。
  • 适用场景:一次Http的请求和响应共享Bean。
  • Ps:限定Spring MVC中使用。

2.4、session

  • 解释:在一个Http Session中,定义一个Bean实例。
  • 适用场景:用户会话的时候共享 Bean, 比如:记录一个用户的登陆信息。
  • Ps:限定Spring MVC中使用。

2.5、application

  • 解释:在一个 Http Servlet Context 中,定义一个 Bean 实例。
  • 适用场景:Web 应用的上下文信息,比如:记录一个应用的共享信息
  • Ps:限定Spring MVC中使用。

2.6、websocket

  • 解释:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
  • 适用场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀ 次初始化后,直到WebSocket结束都是同⼀个Bean。
  • Ps:限定Spring WebSocket中使⽤。

3、设置作用域


3.1设置方法

通过@Scope注解就可以设置Bean作用域,分别有以下两种方式:

a)直接设置值,例如:@Scope("prototype"),如下图:

b)设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量,例如 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),如下图:

注意:ConfigurableBeanFactory只提供了以下几种:

3.2、对比两种设置方式

        上面提到的两种设置方式达到的效果都是一样的, 区别在于直接设置,是建立在你能够记得很清楚,保证不写错的前提下使用的;第二种方法,有IDEA的自动补全,可以保证不出错,这就像是IP地址和域名一样,域名就是方便我们记忆IP地址的一种形式,上述方法中的第二种就是方便记忆的一种方式

小结

Bean作用域是Bean在Spring中的某种行为模式,常用的作用域是下面的前4种,后两种仅做了解:

1. singleton:单例作⽤域

2. prototype:原型作⽤域(多例作⽤域)

3. request:请求作⽤域

4. session:回话作⽤域

5. application:全局作⽤域

6. websocket:HTTP WebSocket 作⽤域

其中前两种是 spring 核⼼作⽤域,⽽后 4 种是 spring mvc 中的作⽤域,其中 bean 的作⽤域是最重要的知识点也是常⻅的⾯试题,一定要牢记~


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈亦康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值