Spring入门——IoC/DI二
Bean的作用域:
xml中配置了这样的一个Bean:
然后在主函数中:
毫无疑问,car和car1对象是同一个实例对象,这是因为bean标签中的scope(作用域)属性的默认值为singleton(单例),表示这个Bean在Spring容器中,是以单例的形式存在。
scope的值还有哪些呢? singleton,prototype,request,session,global-session。其中,前两个是常用的,后面三个是应用于web应用的。singleton表示单例的(默认值),prototype表示多例的,request表示请求范围,session表示会话范围,global-session表示集群环境的会话范围(全局会话范围),当环境不是集群环境时,它就是session。
这里讲一下session 与global-session:
当我们访问某个网站时,页面会有个表单供我们填写用户名,密码,以及服务器生成的验证码,如图,此时只有01服务器空闲,所以由01服务器提供验证码(这是当我们访问登录页面时)
当点击提交填写的表单信息时,因为服务器的状态时瞬息万变的,此时01服务器已由空闲变为满负荷状态,02服务器由满负荷变为空闲状态,此时由02服务器为我们提供服务,但是需要与提交表单信息中的验证码,与服务器中的验证码做是否一致判断,而此时的验证码在01服务器中,02服务器无法去获取到01服务器的验证码,无法与表单信息的验证码比较。
上面说的这种情况,就是scope为session的会话范围情况,每个服务器就是一个session会话范围。
而下图描述的就是scope为global-session的情况,所有服务器共享一个session会话,就都可以得到验证码的信息了。
Bean对象的生命周期:
单例对象:
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
销毁:容器销毁,对象销毁
总结:单例对象的生命周期和容器共存亡
多例对象:
出生:当我们使用Bean对象时,spring才为我们创建
活着:对象只要是在使用过程中,就一直都活着
销毁:对象长时间不用,且没有别的对象引用时,由Java垃圾回收机制回收