Spring的IoC容器功能非常强大,负责Spring的Bean的创建和管理等功能。了解Spring Bean的生命周期对我们了解整个Spring框架会有很大的帮助。
本文主要介绍ApplicationContext和BeanFactory两种容器的Bean的生命周期。
Bean 的生命周期由多个特定的生命阶段组成,每个生命阶段都开除了一扇门,允许外接对 Bean 施加控制。
在 Spring 中,我们可以从两个层面定义 Bean 的生命周期:第一个层面是 Bean 的作用范围;第二个层面是是实例化 Bean 时所经历的一系列阶段。
BeanFactory和ApplicationContext是Spring两种很重要的容器,前者提供了最基本的依赖注入的支持,而后者在继承前者的基础进行了功能的拓展,例如增加了事件传播,资源访问和国际化的消息访问等功能。
InstantiationAwareBeanPostProcessor
接口,
在实例化 Bean 之前,将调用接口的 postProcessBeforeInstantiation()方法; InstantiationAwareBeanPostProcessor
接口,在实例化 Bean 之后,调用该接口的
postProcessAfterInstantiation()方法,在这里可以对已经实例化的对象进行一些「梳妆打扮」; InstantiationAwareBeanPostProcessor
接口的
postProcessPropertyValues()方法; BeanNameAware
接口,将调用 setBeanName()方法,将配置文件中该 Bean 对应的名称设置到 Bean 中; BeanFactoryAware
接口,将调用 setBeanFactory()接口方法,将 BeanFactory 容器设置到 Bean 中; BeanPostProcessor
后处理器,将调用 postProcessBeforeInitialization(Object bean,
String beanName)接口方法对 Bean 进行加工操作,一些常见的功能如AOP、动态代理等都是通过这个接口实现的; InitializingBean
接口,将调用接口的 afterPropertiesSet()方法; BeanPostProcessor
后处理器,将调用 postProcessAfterInitialization(Object
bean, String beanName)接口方法对 Bean 进行加工操作; DisposableBean
接口,则调用destroy()方法,在此处可以编写如资源释放、日志记录等工作; 下面对这些关键点的特定方法进行一定的分类:
如果喜欢解绑Spring,可以使用init-method替换实现InitializingBean接口,或者使用destroy-method替换实现DisposableBean接口。
甚至还可以使用@PostConstruct、@PreDestroy注解来完成相同的方法标记工作,它们是由InitDestroyAnnotationBeanPostProcessor后处理器实现的。
Bean 在应用上下文中的生命周期和再 BeanFactory 中生命周期类似,不同的是,如果 Bean 实现了 ApplicationContextAware 接口,会增加一个调用该接口的 setApplicationContext()方法的步骤。 此外,如果配置文件中声明了工厂后处理器接口 BeanFactoryPostProcessor 的实现类,则应用上下文在装载配置文件之后初始化 Bean 实例之前将调用 这些 BeanFactoryPostProcessor 对配置信息进行加工处理,如 Spring 自带的后工厂处理器 PropertyPlaceholderConfigurer、CustomEditorConfigurer等。
ApplicationContext 和 BeanFactory 另一个最大的不同之处在于:前者会利用 Java 反射机制自动识别出配置文件中定义的 BeanPostProcessor、InstantiationAwareBeanPostProcessor和 BeanFactoryPostProcessor,并自动将它们注册到应用上下文中; 后者需要在代码中通过手动调用 addBeanPostProcessor()方法进行注册。
所以一般我们都是用 ApplicationContext,只需要在配置文件中配置对应的
本文首次发布于S.L’s Blog, 作者 @stuartlau , 转载请保留原文链接.