一、bean的生命周期
在Spring框架中,Bean(对象)的生命周期经历以下阶段:
-
实例化:在这个阶段,Spring容器根据配置或注解创建Bean的实例。这可以通过构造函数实例化、静态工厂方法或实例工厂方法实现。
-
属性赋值:在实例化后,Spring容器会为Bean的属性注入值,可以通过构造函数注入、属性的setter方法注入或注解方式进行属性赋值。
-
初始化:在所有属性被赋值后,Spring容器会调用Bean的初始化方法。可以使用
@PostConstruct
注解标记初始化方法,也可以配置初始化方法的名称。 -
使用:在初始化完成后,Bean可以被应用程序使用。它可以响应请求、处理业务逻辑等。
-
销毁:当Bean不再需要时,Spring容器会调用Bean的销毁方法进行清理工作。可以使用
@PreDestroy
注解标记销毁方法,也可以配置销毁方法的名称。
注意,Bean的销毁是可选的,不是所有的Bean都需要销毁方法。对于单例作用域的Bean,默认情况下,当Spring容器关闭时,会调用单例Bean的销毁方法。对于原型作用域的Bean,Spring容器不会管理其销毁,需要手动释放资源。
此外,Spring还提供了一些扩展点,允许开发人员在Bean的生命周期中插入自定义逻辑,例如使用BeanPostProcessor
接口进行前置处理或后置处理,以及使用BeanFactoryPostProcessor
接口对BeanFactory进行后置处理。
通过控制Bean的生命周期,Spring框架提供了灵活的管理和配置机制,使开发人员能够在不同的阶段对Bean进行自定义操作,并确保Bean能够正确地初始化和销毁。
二、bean标签scope的可取值
1、singleton:每个Spring容器中只存在一个Bean实例,该实例是全局共享的。无论何时请求该Bean,都会返回同一个实例。
2、prototype:每次请求Bean时都会创建一个新的实例。每个实例都是独立的,不共享状态。
3、Request:Web项目中,每个HTTP请求都会创建一个新的实例。在同一个请求中,多次请求该Bean会得到同一个实例,但不同请求之间的Bean实例是隔离的。
4、Session:Web项目中,每个HTTP会话(Session)中只存在一个Bean实例。在同一个会话中,多次请求该Bean会得到同一个实例,但不同会话之间的Bean实例是隔离的。
5、GlobalSession:在基于Portlet的Web应用中,每个全局会话(Global Session)中只存在一个Bean实例。
在Spring 2.0之前,有singleton和prototype两种;
在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。