1.Bean容器
对应Spring应用,应用对象存活于Spring容器中(container),Spring容器负载对象的创建、配置、装载以及对象的生命周期的管理。
Spring容器可以分为两组不同的类型:
- Bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持;
- 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,提供应用框架级别的服务,例如从属性文件中解析文本信息、发布应用事件给事件监听者。
对于Bean工厂和应用上下文所支持的功能,官方提供的了一个对比表格:
Feature | BeanFactory | ApplicationContext |
---|---|---|
Bean的实例化和装配 | Yes | Yes |
生命周期管理 | No | Yes |
| No | Yes |
| No | Yes |
便捷的 | No | Yes |
内置的 |
| Yes |
通常情况在应用都会使用应用上下文来作为Spring容器,对应低层次的Bean工厂很少使用。Spring提供了几种常见的应用上下:
- AnnotationConfigApplicationContext:使用一个使用个基于java的配置类来加载Spring应用上下文;
- AnnotationConfigWebApplicationContext:使用一个或多个基于java的配置类来加载Spring Web应用上下文;
- ClassPathXmlApplicationContext:通过类路径下的一个或多个XML配置文件来加载上下文定义;
- FileSystemXmlApplicationContext:通过指定下文件系统路径下的一个或多个XML配置文件来加载上下文定义;
- XmlWebApplicationContext:使用Web应用下的一个或多个XML配置文件来加载上下文定义。
2.Bean的生命周期
Spring中所有Bean的生命周期都遵循如下流程:
- Spring实例化Bean;
- Spring将值和引用的Bean注入到Bean中对应的属性中;
- 如果Bean实现了BeanNameAware接口,Spring将调用它们的setBeanName()方法,并将Bean的ID传递给这个方法;
- 如果Bean实现了BeanFactoryAware接口,Spring将调用它们的setBeanFactory()方法,将BeanFactory容器实例传入;
- 如果Bean实现了ApplicationContextAware接口,Spring将调用它们的setApplicationContext()方法;
- 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
- 如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法;
- 如果Bean使用声明了自定义初始化方法(init-method),将调用这个方法;
- 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
- Bean已经准备就绪,应用程序可以开始使用它们,它们将一直驻留在应用上下文中,直到被应用上下文被销毁;
- 当Spring容器关闭或销毁Bean,如果Bean实现了DisposableBean接口,Spring将调用它们的destroy()方法;
- 被销毁的Bean,如果使用声明了自定义销毁方法(destroy-method),将调用这个方法,Bean的生命zhou周期终止。