Spring Bean的作用域
Spring是一个轻量级的开源应用开发框架,广泛应用于企业开发中,并且受到广大开发人员的喜欢。本篇只是针对spring中bean的作用域进行学习和总结。
Bean作用域的分类
bean的作用域分为五类:singleton ,prototype, request, session, global session 。
Singleton 作用域
此配置项是spring的默认项,也叫单例,在每个springIOC容器中一个bean定义对应一个对象实例,不同容器中不同。
实验如下:bean配置如下
bean的获取方式如下
结果如下:
如果将如上配置改为下面:
<bean id="myBean" class="com.pactera.spring.TestSingleton" scope="singleton"/> 则结果仍然与上面一致。
prototype 作用域
该作用域表示每次从工厂中获取bean时,都会创建一个新的bean。
本例实验我们用包自动扫描和注解得方式去实现bean的定义
开启包注解自动扫描
获取bean
运行后结果如下:
request 作用域
该作用于只有在Web应用中才会起作用。表示每个请求中会创建一个实例化对象。
我们需要搭建一个springWebMVC框架,并声明一个bean实现ApplicationContextAware用来获取容器中的bean。
Controller层中要获取容器中的作用域声明为request的Bean.
MyStatus的注解:
运行服务器后两次请求http://localhost:8180/springMVC/test/hi.do(我的前端控制器中url-pattern配置的为*.do).日志结果显示如下:
Session作用域
和request作用域一样,也是只有在web应用中才起作用。每个session中同一个实例,不同session不同实例。
bean注解声明作用域为session
调用类
session过期时间设置为1分钟
启动服务器后调用请求:
两次请求间隔超过1分钟的结果如图:
结果证明不同session中实例不同。
两次请求时间不超过1分钟结果如图:
结果证明相同session中实例相同。
global session 作用域
此注解仅仅适用于portlet的web应用中,类似于http session。portlet web应用中的全局session可以被不同的portlet共享,同一个全局session中实例是同一个。由于不常用,所以不做代码层面的学习分析,仅作了解。
以上是对spring中bean的作用域的简单分析,后续会做源码分析。