Spring Bean Scope的使用方法、实现原理以及自定义Scope

Spring Bean Scope的使用方法、实现原理以及自定义Scope我们在使用XML或注解定义Bean的时候,Spring并不是拿着这些配置信息直接去生成相应的Bean。

欢迎大家来到IT世界,在知识的湖畔探索吧!

我们在使用XML或注解定义Bean的时候,Spring并不是拿着这些配置信息直接去生成相应的Bean,而是先生成一个对应的BeanDefinition,等到合适的时候再去创建Bean,这种做法是相当明智的。

因为有了BeanDefinition,Spring就可以通过同一个定义中创建任意多个Bean实例了,甚至BeanDefinition还可以继承使用。

通过BeanDefinition我们不仅仅可以控制Bean的依赖和属性,还可以控制Bean的作用域(Scope)。

今天就来仔细分析一下Spring Bean Scope相关的事情。本主要包括的内容:

  1. Bean Scope的类型
  2. 如何使用Bean Scope
  3. Bean Scope实现的原理
  4. 如何实现一个自定义的Scope类型

Bean Scope有哪几种

Spring Bean Scope的使用方法、实现原理以及自定义Scope

上面简单的列出了Spring框架目前默认支持的6种Scope类型。除了这6种,Spring还定义了两种类型:

SimpleThreadScope和SimpleTransactionScope,但是这两种Scope默认是不启用的,需要我们手动注册到BeanFactory上去。

Singleton Scope

singleton类型的Scope是我们平时开发过程中使用最多的一种,在我们不指定Bean的Scope类型的时候Spring默认采用的就是singleton类型。下图展示了Spring管理Singleton Scope Bean的基本形式:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

Prototype Scope

每次从容器中获取Prototype Scope类型的Bean,容器都会为我们重写创建一个新的。基本形式如小图所示:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

其它几种Scope

其它几种Scope大体可以描述为:处于同一个过程中的共用同一个Bean,新的过程会创建新的Bean实例。我们以request类型为例,可以描述为下图:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

Bean Scope是如何使用的

Bean Scope使用上是非常简单的,我们只需要在定义的时候添加上scope属性即可,如下面代码所示:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

这小段代码就定义了一个scope类型为prototype的Bean,使用的时候正常注入就能够得到Bean的实例了。

大作用域的Bean依赖了小作用域的Bean的时候该如何处理呢?比如:singleton类型的Bean依赖了prototype类型的Bean。

我们知道Bean依赖的属性会在它创建的时候注入进去,一个Bean的生命周期内属性注入只会有一次,这就导致实际注入的属性后续就不会变化了,很多时候这并不是我们想要的。那如何能让singleton bean中注入的prototype每次使用的时候都拿到最新的呢?一般有以下几种处理办法:

  • 使用<aop:scoped-proxy/>进行代理。
  • 直接从ApplicationContext中获取,这样每次拿到的肯定都是最新的。
  • 使用lookup-method功能。

由于篇幅所限,这里只给出了几种解决办法,每一种处理办法的代码以及实现原理这里就先不分析了,后续会单独进行详细的分析。

Bean Scope的实现原理

看完了Scope的用法,那么接下来就要看看Spring中是如何实现Scope的。我们进入org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean方法,就能找到如下的代码:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

从代码中我们可以看到:

  • 对于singleton,会先判断是否已经有实例了,如果有就不会调用创建方法,如果没有就会去创建。
  • 对于prototype,则会直接创建bean。
  • 对于其它方式,会根据scope名称去查找注册的scope,如果找到就调用scope的get方法获取bean,是新建还是不新建,就是scope实现的事情了,Spring容器就不会管的。

自定义Scope是如何实现的

看了上面根据Scope创建Bean的方式,我们知道除了singleton和prototype这两个,其它的scope都是使用的相同的实现原理的:继承Scope接口,然后注册实现的scope类型。

Spring框架中已经实现的Scope的类图:

Spring Bean Scope的使用方法、实现原理以及自定义Scope

注册scope:

Spring Bean Scope的使用方法、实现原理以及自定义Scope


相关阅读:

Autowired注解都会用,那么你知道它实现自动注入的原理吗

Spring Bean初始化回调的各种用法你真的懂吗?快来看看吧!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/73511.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信