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

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 Bean的6种作用域是什么?如何使用?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

前言

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对象默认就是单例作用域,在任何地方一旦修改了该单例对象,随后再访问这个对象的时候就是修改之后的对象。

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

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”),如下图:

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

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

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

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

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

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 的作⽤域是最重要的知识点也是常⻅的⾯试题,一定要牢记~


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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/129799.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!