Spring bean ApplicationContext BeanFactory 生命周期

转载 2016年08月31日 10:28:57


Spring Bean 生命周期

任何一个事物都有自己的生命周期,生命的开始、生命中、生命结束。大家最熟悉的应该是servlet 的生命周期吧。和 servlet 一样 spring bean 也有自己的生命周期。本文我就向大家讲述 spring bean 的生命周期,这个对理解 spring 框架有非常好的作用。

大家应该知道spring 中有几种供 springbean 生存的容器: BeanFactory 、 ApplicationContext 、webApplicationContext 。由于 ApplicationContext 和 webApplicationContext 基本一样。所有这里就只介绍BeanFactory 和 ApplicationContext 。

理解springBean 的生命周期主要通过两个层面来理解。其一是 Bean 的作用范围,其一是实例化 Bean 时所经历的一系列阶段。

一、 BeanFactory

下图描述了BeanFactory 中 bean 生命周期的完整过程

 

 

1. 当调用者通过 getBean( name )向 容器寻找Bean 时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之前,将调用该接口的 postProcessBeforeInstantiation ()方法,

2. 根据配置情况调用 Bean构造函数或工厂方法实例化 bean  

 

3. 如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,在实例 bean 之后,调用该接口的 postProcessAfterInstantiation ()方法,可以在这里对已经实例化的对象进行一些装饰。

4. 受用依赖注入,Spring 按照 Bean 定义信息配置 Bean 的所有属性 ,在设置每个属性之前将调用InstantiationAwareBeanPostProcess接口的 postProcessPropertyValues ()方法 。 

 

5 .如果 Bean 实现了 BeanNameAware 接口,工厂调用 Bean 的 setBeanName() 方法传递 Bean 的 ID 。 

 

6 .如果 Bean 实现了 BeanFactoryAware 接口,工厂调用 setBeanFactory() 方法传入工厂自身。 

 

7 .如果 BeanPostProcessor 和 Bean 关联,那么 将调用该接口 postProcessBeforeInitialzation() 方法  bean进行加工操作,这个非常重要, spring 的 AOP 就是用它实现的。  

 

8. 如果bean 实现了 InitializingBean 接口,将调用 afterPropertiesSet ()方法

 

9 如果Bean 指定了 init-method 方法,它将被调用。 

 

10 如果有BeanPsotProcessor 和 Bean 关联,那么它们的 postProcessAfterInitialization() 方法将被调用。 到这个时候, Bean 已经可以被应用系统使用了  

 

11. 如果在<bean> 中指定了该 bean 的作用范围为 scope="prototype", 将 bean 的调用者,调用者管理该 bean 的生命周期, spring 不在管理该 bean 。

 

12. 如果在<bean> 中指定了该 bean 的作用范围为 scope="singleton", 则将该 bean 放入 springIOC 的缓存池中,将触发 spring 对该 bean 的生命周期管理。

 

13. 有两种方法可以把它从Bean Factory 中删除掉   

1.如果 Bean 实现了 DisposableBean 接口, destory() 方法被调用。 

 

2.如果指定了订制的销毁方法,就调用这个方法。 

 

二、 ApplicationContext

下图描述了ApplicationContext 的生命周期

 

 

通过上图很容易发现其实应该上下文和BeanFactory 只是多了一个接口, 如果Bean 实现了ApplicationContextAwre 接口, setApplicationContext() 方法被调用。

还有如果配置文件中生明了工厂后处理器接口 BeanFactoryPostProcessor的实现类,则应用上下文在装配配置文件之后初始化 bean 之前将调用该接口对配置信息进行加工。

还有应该上下文的这些后处理器只要和普通的bean 一样配置在 spring 配置文件中就行了,不需要事先声明。

 

三、 总结  


Bean的完整生命周期从 spring 容器开始实例化 bean 开始,到销毁。可以从三点来理解

1、 bean自身的方法:包括构造方法、 set 方法、 init-method 指定的方法、 destroy-method 指定的方法

2、 Bean级生命周期接口方法:如 BeanNameAware  BeanFactoryAware 、Initializingbean、DisposableBean等这些接口方法由 bean类实现。

3、 容器级生命周期接口方法:上图中带星的。有InstantiationAwareBeanPostProcessor 、 BeanPostProcessor 等。一般称为后处理 器。他们一般不由bean 本身实现,独立存在,注册到 spring 容器中。 Spring 通过接口反射预先知道,当 spring 容器创建任何 bean 时,这些后处理器都会发生作用。所以他们是全局的,用户可以通过编码对只感兴趣的 bean 进行处理。

       Spring为 bean 提供了细致周全的生命周期过程,通过实现特定的接口或通过《bean 》属性设置,都可以对 bean 的生命周期过程施加影响。我们可以随意的配置bean 的属性,使用非常灵活。但笔者在这里建议大家不要过多的使用 bean 实现接口,因为这样会使你的代码和 spring 聚合比较紧密。可以考虑使用后处理 bean ,来实现一些特殊的功能,并且非常的方便。

在ApplicationContext容器中的bean的生命周期详解

在Spring中,
  • ikaraide
  • ikaraide
  • 2014年04月20日 15:19
  • 1490

一,Spring容器BeanFactory和ApplicationContext对比

BeanFactory和ApplicationContext对比BeanFactory和ApplicationContext联系BeanFactory和ApplicationContext是Sprin...
  • u010871004
  • u010871004
  • 2016年12月12日 22:06
  • 879

BeanFactory和ApplicationContext实例化Bean 的不同

BeanFactory和ApplicationContext实例化Bean 的时机不同: BeanFactory等到程序需要Bean实例时才创建Bean,而ApplicationContexts在创建...
  • u014470581
  • u014470581
  • 2016年03月10日 23:23
  • 293

Spring中BeanFactory和ApplicationContext的生命周期及其区别详解

Bean的生命周期在很多技术中,都有生命周期这个概念,如在Android中,有Activity、Fragment等的生命周期;在Web容器中,有Servlet的生命周期。想要成为高级开发者,就必须要深...
  • qq_32651225
  • qq_32651225
  • 2017年10月23日 21:20
  • 204

Spring Bean在BeanFactory生命周期

生命周期过程 如果容器注册InstantiationAwareBeanPostProcessor接口,调用postProcessBeforeInstantiation方法 Bean的实例化(调用默认构...
  • csujiangyu
  • csujiangyu
  • 2015年12月14日 18:34
  • 1101

java面试题三:spring中的BeanFactory与ApplicationContext的作用和区别?

作用:1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。           2. ApplicationCo...
  • maoxiao1229
  • maoxiao1229
  • 2012年09月11日 10:48
  • 9093

spring bean的生命周期图解及案例分析

spring bean的生命周期及案例分析
  • huiyong_zhou
  • huiyong_zhou
  • 2017年04月24日 14:06
  • 372

Spring中的beanFactory和ApplicationContext的有什么区别和关联

从上面的类结构图中可以看出来,ApplicationContext 是 BeanFactory接口的子接口 其中BeanFactory获得配置文件的实例是: // 使用BeanFactory 读...
  • judyfun
  • judyfun
  • 2015年03月10日 10:58
  • 880

Spring源码之ApplicationContext(三)加载BeanFactory

准备好了环境之后,接下来要做的事情是初始化BeanFactory,并进行XML文件读取。总的一句话就是加载BeanFactory。那么Spring是如何实现这个功能呢?接下来笔者就要分析。在分析之前,...
  • owen_william
  • owen_william
  • 2016年03月20日 23:56
  • 543

spring中beanfactory和applicationcontext创建bean的区别

l        BeanFactory :这是一个工厂,用于生成任意bean。        采取延迟加载,第一次getBean时才会初始化Bean l        ApplicationCo...
  • wwe4023
  • wwe4023
  • 2017年05月28日 14:53
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring bean ApplicationContext BeanFactory 生命周期
举报原因:
原因补充:

(最多只允许输入30个字)