Spring容器、Bean生命周期
- 1. 常见的应用上下文
- 2. Bean生命周期
在基于Spring的应用中,你的应用对象生存于Spring容器中。Spring容器负责创建对象、封装它们、配置它们并管理它们的整个生命周期,从生存到死亡(在这里可能就是new到finalize)。
容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
Spring自带多个容器实现,可以归纳为两种不同的类型。
- bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最单的容器,提供基本的DI支持。
- 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
1. 常见的应用上下文
Spring自带了多种类型的应用上下文。常见的应用上下文有:
ApplicationContext | 描述 |
---|---|
AnnotationConfigApplicationContext | 从一个或多个基于Java的配置勒种加载Spring应用上下文 |
AnnotationConfigWebApplicationContext | 从一个或多个基于Java的配置类中加载Spring Web应用上下文 |
ClassPathXmlApplicationContext | 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源 |
FileSystemXmlApplicationContext | 从文件系统下的一个或多个XML配置文件中加载上下文定义 |
XmlWebApplicationContext | 从Web应用下的一个或多个XML配置文件中加载上下文定义 |
2. Bean生命周期
bean在Spring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对Spring如何管理bean进行个性化定制
阶段 | 描述 |
---|---|
1. 实例化 | Spring对Bean进行实例化 |
2. 填充属性 | Spring将值和bean的引用注入到bean对应的属性中 |
3. 调用BeanNameAware的setBeanName()方法 | 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法 |
4. 调用BeanFactoryAware的setBeanFactory()方法 | 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入 |
5. 调用ApplicationContextAware的setApplicationContext()方法 | 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来 |
6. 调用BeanPostProcessor的与初始化方法 | 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法 |
7. 调用InitializingBean的afterPropertiesSet()方法 | 如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。 |
8. 调用自定义的初始化方法 | 如果bean使用init-method声明了初始化方法,该方法也会被调用 |
9. 调用BeanPostProcessor的初始化后方法 | 如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessAfterInitaliaztion()方法 |
— 容器初始化完毕 — | |
— bean正常调用 — | |
— 容器关闭 — | |
10. 调用DisposableBean的destroy()方法 | 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。 |
11. 调用自定义的销毁方法 | 如果bean使用destory-method声明了销毁方法,该方法也会被调用。 |
重点:
- About org.springframework.beans.factory.config.BeanPostProcessor
ApplicationContexts 可以自动检测bean定义中的BeanPostProcessor bean,并将它们应用于随后创建的任何bean。
Javadoc
Factory hook that allows for custom modification of new bean instances, e.g. checking for marker interfaces or wrapping them with proxies.
ApplicationContexts can autodetect BeanPostProcessor beans in their bean definitions and apply them to any beans subsequently created. Plain bean factories allow for programmatic registration of post-processors, applying to all beans created through this factory.