从Spring源码知晓其所支持的Bean Scope

  众所周知,在Spring2之前,Bean只是支持两种Scope:singleton和prototype,也就是单例和多例,但是之后又加入了其他的Bean Scope,现在已经到了Sping5,如下图:

那它现在到底支持几种Scope,我们就从我现在用的Spring4版本的源码中来获取。

  要找到入口,首先要了解xml中bean标签的scope属性,或者@Scope注解,我们就从注解入口,给一个bean添加@Scope注解,会出现下面的提示:

从提示中我们可以看出与Bean Scope相关的两个类:ConfigurableBeanFactory与WebApplicationContext,它们都是接口,其中Bean Scope可以从这两个类的源码中,很显然的看出是几种:

从源码中可以看出:除了自定义的Scope,Spring现在的版本自身一共支持6种Bean Scope,分别是ConfigurableBeanFactory接口中的singleton、prototype,以及WebApplicationContext接口中的request、session、globalSession、application。对这几种Scope一一解释:

1、singleton:单例模式,每个Spring IoC容器仅有一个单实例,这是Bean所默认的Scope;

2、prototype:多例,这个是说在每次注入的时候回自动创建一个新的bean实例;

3、request:每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效;

4、session:每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效;

5、globalSession:类似于标准的全局的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。在 global session 作用域中定义的 bean 被限定于全局 portlet Session 的生命周期范围内。如果你在 web 中使用 global session 作用域来标识 bean,那么 web 会自动当成 session 类型来使用。

6、application:在一个web应用中只创建一个实例。

后四种Scope和前两种Scope属于不同的接口可以看出,当且仅当仅当用户使用支持 Web 的 ApplicationContext 时,最后四种才可用。之所以注解@Scope提示只出来了四种Scope:singleton、prototype、request、session,是因为globalSession、application这两种很少用到,甚至request、session都不常用。

猜你喜欢

转载自blog.csdn.net/Apeopl/article/details/84540698