1. bean的作用域
| 作用域 | 说明 | 创建时期 |
| singleton |
当一个 bean 的作用域为 singleton,那么Spring IoC容器中只会存在一个共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回bean的同一实例 |
创建起容器时就同时自动创建了一个bean的对象 每次获取到的对象都是同一个对象 |
| prototype |
每次请求都会创建一个新的 bean 实例 有状态的 bean 应该使用 prototype 作用域,而对无状态的 bean 则应该使用 singleton 作用域 | 创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象 |
| request |
request只适用于Web程序 每一次 HTTP 请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,当请求结束后,该对象的生命周期即告结束 | 每一次 HTTP 请求都会产生一个新的bean |
| session | session只适用于Web程序 | session 作用域表示该针对每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效 |
| requestSession | global session 作用域类似于标准的 HTTP session 作用域,不过仅仅在基于 portlet 的 web 应用中才有意义。 |
五种作用域中,request、session 和 global session 三种作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于 web 的 Spring ApplicationContext 环境。
Spring 容器可以管理 singleton 作用域下 bean 的生命周期,在此作用域下,Spring 能够精确地知道bean何时被创建,何时初始化完成,以及何时被销毁。而对于 prototype 作用域的bean,Spring只负责创建,当容器创建了 bean 的实例后,bean 的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的bean的生命周期。
2. bean的生命周期
生命周期,从创建到销毁。
3. lazy-init=”true”
但我们可以指定Bean节点的lazy-init=”true”来延迟初始化bean,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化。在第一次请求每一个 prototype 的bean 时,Spring容器都会调用其构造器创建这个对象,然后调用init-method属性值中所指定的方法。对象销毁的时候,Spring 容器不会帮我们调用任何方法,因为是非单例,这个类型的对象有很多个,Spring容器一旦把这个对象交给你之后,就不再管理这个对象了。
本文详细解析Spring框架中Bean的五种作用域:singleton、prototype、request、session和globalsession,以及它们在Web程序中的应用。同时,深入探讨了Bean的生命周期,包括初始化和销毁过程,特别关注lazy-init属性如何影响初始化时机。
217

被折叠的 条评论
为什么被折叠?



