我们通常使用 ApplicationContext 作为 Spring 容器. 这里, 我们讲的也是 ApplicationContext 中 Bean 的生命周期. 而实际上 BeanFactory 也是差不多的, 只不过处理器需要手动注册.
(1). 实例化 bean:
对于 BeanFactory 容器, 当客户向容器请求一个尚未初始化的 bean 时, 或初始化 bean 的时候, 需要注入另一个尚未初始化的依赖时, 容器就会调用 createBean 进行实例化, 对于 ApplicationContext 容器, 当容器启动结束后, 通过获取 BeanDefinition 对象中的信息, 实例化所有的 bean.
(2). 设置对象属性 (依赖注入):
实例化后的对象被封装在 BeanWrapper 对象中, 紧接着, Spring 根据 BeanDefinition 中的信息, 以及通过 BeanWrapper 提供的设置属性的接口完成依赖注入.
(3). 处理 Aware 接口:
接着, Spring 会检测该对象是否实现了 xxxAware 接口, 并将相关的 xxxAware 实例注入给 Bean:
1. 如果这个 Bean 已经实现了 BeanNameAware 接口, 会调用它实现的 setBeanName(String beanId) 方法, 此处传递的就是 Spring 配置文件中的 id 值.
2. 如果这个 Bean 已经实现了 BeanFactoryAware 接口, 会调用它实现的 setBeanFactory() 方法, 传递的是 spring 工厂自身
3. 如果这个 Beany 已经实现了 ApplicationContextAware 接口, 会调用 setApplicationContext(ApplicationContext) 方法, 传入 spring 上下文
(4).BeanPostProcessor:
如果想对 bean 进行一些自定义的处理, 那么可以让 bean 实现了 BeanPostProcessor 接口, 那将会调用 postProcessBeforeInitialization(Object object,String s) 方法.
(5).InitializingBean 与 init-method:
如果 bean 在 spring 配置文件中配置了 init-method 属性, 则会自动调用其配置的初始化方法.
(6). 如果这个 Bean 实现了 BeanPostProcessor 接口, 将会调用 postProcessAfterInitialization(Object object,String s) 方法, 由于这个方法是在 Bean 的初始化结束时调用的, 所以可以被应用于内存或缓存技术;
以上几个步骤完成后, Bean 就已经被正确创建了, 之后就可以使用这个 Bean 了.
(7).DisposableBean:
当 Bean 不再需要时, 会经过清理阶段, 如果 Bean 实现了 DisposableBean 这个接口, 会调用其实现的 destroy() 方法;
(8)destroy-method:
最后, 如果这个 bean 的 spring 配置中配置了 destroy-method 属性, 会自动调用其配置的销毁方法.
来源: http://www.bubuko.com/infodetail-3484489.html