Bean的作用域
bean的scope属性
singleton:单例作用域
propotype:原型作用域
默认情况下,我们从Spring容器中拿到的对象均是单例的,对于bean作用域类型如下:
1. singleton作用域(单例作用域)
注:lazy-init是懒加载,如果lazy-init=true是指Spring容器启动时不会实例化这个bean而是等到程序需要调用时才会去实例化。默认是false,即容器在启动的情况下就实例化所有singleton的bean对象,并存放在缓存池中。
-
思考:lazy-init属性为什么要设置为false?
i.可以提前发现潜在的配置文件问题
ii.Bean对象在启动时就会设置在单例缓存池中,使用时不需要再去实例化对象,提高程序运行效率 -
什么对象适合作为单例对象?(什么对象适合交给IOC容器实例化?)
无状态的对象(不存在改变当前对象状态的成员变量) 适用对象:Controller层、Service层、Dao层
-
什么是无状态对象
实际上对象状态的变化往往均是由于属性变化而引起的,比如user类 姓名属性会变化,姓名属性的变化一般会引起User对象状态的变化。对于我们的程序来说,无状态对象没有实例变量的存在,保证了线程的安全性,service层业务对象即是无状态对象。线程是安全的 | |
---|---|
2.prototype作用域(原型作用域)
prototype作用域:SpringIOC 容器在启动时,不会将bean对象实例化设置到缓存池中,每次实例化对象都会创建一个新的实例。
3. Web应用中的作用域
-
request作用域
表示每个请求需要容器创建一个全新Bean。比如提交表单的数据必须是对每次请求新建一个Bean来保持这些表单数据,请求结束释放这些数据
-
session作用域
表示每个会话需要容器创建一个全新Bean。比如对于每个用户一般会有一个会话,该用户的用户信息需要存储到会话中,此时可以将该Bean作用域配置为session级别。
-
globalSession作用域
类似于session作用域,其用于portlet(Portlet是基于lava的Web组件,由Portlet容器管理,并由容器处理请求,生产动态内容)环境的web应用。如果在非非portlet环境将视为session作用域。
注:Web应用中的作用域了解即可
二、Bean生命周期
在Spring中,Bean的生命周期包括bean的定义、初始化和使用和销毁4个阶段
1.bean的定义
在配置文件中定义bean
通过bean标签定义对应的bean对象
2.bean的初始化
IOC容器启动时,自动实例化bean对象
1..在配置文件中通过指定 init-method 属性来完成。
2..实现org.springframework.bean.factory.InitializingBean 接口
3.bean的使用
方式一:使用BeanFactory
方式二:ApplicationContext
- bean的销毁
步骤一:通过AbstractApplicationContext对象,调用其close方法实现bean的销毁过程
步骤二:在配置文件中指定对应的销毁效用的方法 destroy-method