管理 bean 生命周期
下图描述了Spring 如何管理器容器中 bean 的生命周期:
任何IoC 容器(包括Spring 在内)的一个重要部分是,可以构建bean,使得它们可以在生命周期中的某些点接收通知。
- Bean 实例化和DI
- 检查Spring Awareness
- 创建Bean 生命周期回调
- 销毁Bean 生命周期回调
创建Bean 会经过一系列的步骤,主要包括:
- 实例化Bean 对象;
- 设置Bean 属性;
- 如果通过各种Aware 接口声明了依赖关系,则会注入 Bean 对容器基础设施层面的依赖。具体包括BeanNameAware、BeanFactoryAware 和 ApplicationContextAware,分别会注入 Bean ID、Bean Factory 或者 Application Context。
- 如果有Bean实现了BeanPostProcessor接口( 后置处理器 ),则会回调该接口的postProcessBeforeInitialzation()方法。
- @PostConstruct 标注的方法。
- 如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法。
- 如果Bean配置了init-method方法,则会执行init-method配置的方法。
- 如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessAfterInitialization()方法。
此时 Bean 可以用了。
当容器关闭的时候,则会调用:
- @PreDestroy 标注的方法
- DisposableBean.destroy()
- 自定义的 destroy-method
- 对象自定义的 finalize 方法
Spring Bean 有5个作用域,其中最基础的有下面2种:
- Singleton,Spring 默认作用域,也就是每个 IOC 容器创建唯一的一个Bean实例。
- Prototype,针对每一个 getBean 请求,容器都会单独创建一个Bean 实例。
如果是Web 容器,则支持另外3种作用域:
- Request,为每个 HTTP 请求创建单独的Bean 实例。
- Session,Bean 实例的作用域是Session 范围。
- GlobalSession,用于 Portlet 容器,因为每个 Portlet 有单独的Session,GlobalSession 提供一个全局性的 HTTP Session。