Spring之Bean的作用域与生命周期

 在前面博客中提到容器启动获得BeanDefinition对象中有一个scope 属性。该属性控制着bean对象的作用域。本章节介绍Bean的作用域及生命周期,了解bean是怎么来的又怎么没的。

一、Bean的作用域
在Bean容器启动会读取bean的xml配置文件,然后将xml中每个bean元素分别转换成BeanDefinition对象。在BeanDefinition对象中有scope 属性,就是它控制着bean的作用域。
Spring框架支持5种作用域,有三种作用域是当开发者使用基于web的ApplicationContext的时候才生效的。下面就是Spring直接支持的作用域了,当然开发者也可以自己定制作用域。

作用域

描述

单例(singleton)

(默认)每一个Spring IoC容器都拥有唯一的一个实例对象

原型(prototype

一个Bean定义,任意多个对象

请求(request

一个HTTP请求会产生一个Bean对象,也就是说,每一个HTTP请求都有自己的Bean实例。只在基于webSpring ApplicationContext中可用

会话(session

限定一个Bean的作用域为HTTPsession的生命周期。同样,只有基于webSpring ApplicationContext才能使用

全局会话(global session

限定一个Bean的作用域为全局HTTPSession的生命周期。通常用于门户网站场景,同样,只有基于webSpring ApplicationContext可用

我们可以以XMLInstance类为基础演示一下singleton和prototype作用域。
这里使用通过BeanFactory的getBean方法获取两次bean对象。

复制代码
        XMLInstance instance=(XMLInstance)factory.getBean("xmlinstance");         instance.setName("123");         instance.Breath();         instance=(XMLInstance)factory.getBean("xmlinstance");         instance.Breath();
复制代码

如果我们采用bean默认的作用域singleton,如下配置,则两个getbean获取的对象是一致的。

复制代码
  <bean id="xmlinstance" class="com.demo.model.XMLInstance" scope="singleton">      <property name="air" ref="CleanAir"></property>      <property name="name" value="abc"></property>  </bean>
复制代码
复制代码
输出结果:Name:123;Air:CleanAirName:123;Air:CleanAir
复制代码

如果我们采用bean默认的作用域prototype,如下配置,则两个getbean获取的对象是不一致的。

复制代码
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信