spring容器中bean的作用范围
spring容器中bean的作用范围范围五类,bean的作用范围不同对bean的生命周期和创建方式也会产生一定的影响。
singleton | 以单例形式存在,容器中仅有一个bean实例。
|
prototype | 每次从容器中调用bean时,容器都创建一个新的实例,每次调用都相当于new一个新的对象。 |
request |
每次http请求都会创建一个新的bean。 此作用域仅适用于webApplicationContext环境。 |
session |
同一个session共享同一个bean,不同的session使用不同的bean。 此作用域仅适用于webApplicationContext环境。 |
global session |
同一个全局session共享一个Bean,一般用于portlet应用环境, 此作用域仅适用于webApplicationContext环境。 |
生命周期在bean配置时使用scope=“xxx”的方式进行生命。
spring的ApplicationContext容器在启动时,自动实例化所有singleton类型的bean并缓存在容器中,在使用时就不需要再进行实例化操作。这样做不仅可以提高运行的效率而且可以在提前实例化的过程中检查bean的配置是否有错误。如果不想提前实例化singleton类型的bean,只需要把lazy-init配置为true即可。但是如果lazy-init为true的bean被其他提前实例化的bean所引用,那么该bean依然会被提前实例化。
对于prototype类型的bean,spring容器在启动时并不进行实例化,当需要使用时再进行实例化,实例化后spring就将其交给调用者,之后不再管理其生命周期。
request作用域的bean对应着一个http请求,http请求处理完毕后,容器销毁该bean。
session作用域的bean对应着一次session会话,这样几个http请求就可以共享一个bean,session会话结束对应的bean才被销毁。
globalSession作用域类似于session作用域,不过仅在portlet的web应用中使用。Portlet规范定义了全局Session概念,它被组成portlet web应用的所有子portlet共享。如果不在Portlet web应用环境下,globalSession自然等价于session作有域了。