第三章 3.4 DI之Bean的作用域 --《跟我学Spring》笔记 张开涛

Bean的作用域

Spring提供“singleton”和“prototype”两种基本作用域,

另外提供“request”、“session”、“global session”三种web作用域;Spring还允许用户定制自己的作用域。

基本的作用域

一、singleton  (按照 单例设计模式)

    指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命 周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。

GoF单例设计模式指“保证一个类仅有一个实例,并提供一个访问它的全局访问点”,介绍了两种实现:通过在 类上定义静态属性保持该实例和通过注册表方式。

1)通过在类上定义静态属性保持该实例

    一般指一个Java虚拟机 ClassLoader装载的类只有一个实例,一般通过类 静态属性保持该实例,这样就造成需要单例的类都需要按照单例设计模式进行编码;Spring没采用这种方式,因为 该方式属于侵入式设计;代码样例如下:

以上定义个了个单例类,首先要私有化类构造器;其次使用InstanceHolder静态内部类持有单例对象,这样可以得 到惰性初始化好处;最后提供全局访问点getInstance,使得需要该单例实例的对象能获取到;我们在此还提供了一 个counter计数器来验证一个ClassLoader一个实例。具体一个ClassLoader有一个单例实例测试请参考代码 “cn.javass.spring.chapter3. SingletonTest”中的“testSingleton”测试方法,里边详细演示了一个 ClassLoader有一个单例实例

2) 通过注册表方式

 首先将需要单例的实例通过唯一键注册到注册表,然后通过键来获取单例,让我们直接看实 现吧,注意本注册表实现了Spring接口“SingletonBeanRegistry”,该接口定义了操作共享的单例对象,Spring 容器实现将实现此接口;所以共享单例对象通过“registerSingleton”方法注册,通过“getSingleton”方法获 取,消除了编程方式单例,注意在实现中不考虑并发:

____________________________________________________________________________

接下来让我们看看在Spring中如何配置单例Bean吧,在Spring容器中如果没指定作用域默认就是“singleton”, 配置方式通过scope属性配置,具体配置如下:

Spring管理单例对象在Spring容器中存储如图3-5所示,Spring不仅会缓存单例对象,Bean定义也是会缓存的,对于惰性初始化的对象是在首次使用时根据Bean定义创建并存放于单例缓存池。

    惰性初始化的目的是延迟对象的初始化,直到程序真正使用它,同时确保它只初始化一次

二、prototype  (原型设计模式

即原型,指每次向Spring容器请求获取Bean都返回一个全新的Bean,相对于“singleton”来说 就是不缓存Bean,每次都是一个根据Bean定义创建的全新Bean。

GoF原型设计模式,指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

____________________________________________________________________________

Web应用中的作用域

一、request作用域:表示每个请求需要容器创建一个全新Bean。比如提交表单的数据必须是对每次请求新建一个 Bean来保持这些表单数据,请求结束释放这些数据。

二、session作用域:表示每个会话需要容器创建一个全新Bean。比如对于每个用户一般会有一个会话,该用户的 用户信息需要存储到会话中,此时可以将该Bean配置为web作用域。

三、globalSession:类似于session作用域,只是其用于portlet环境的web应用。如果在非portlet环境将视为 session作用域。配置方式和基本的作用域相同,只是必须要有web环境支持,并配置相应的容器监听器或拦截器从而能应用这些作 用域,我们会在集成web时讲解具体使用,大家只需要知道有这些作用域就可以了。

猜你喜欢

转载自blog.csdn.net/qq_29373285/article/details/85037978