Bean的生命周期图解


集体过程如下:

  1. 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前,将调用接口的postProcessBeforeInstantiation()方法;
  2. 根据配置情况调用Bean的构造函数或工厂方法实例化Bean;
  3. 如果容器注册了InstantiationAwareBeanPostProcessor接口,那么实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的对象进行一些"梳妆打扮";
  4. 如果Bean配置了属性信息,那么容器在这一步着手将配置值设置到Bean对引发的属性中,不过在设置每个属性之前将先调用InstantiationAwareBeanPostProcessor接口的postProcessPorpertyValues()方法;
  5. 调用Bean的属性设置方法设置属性值;
  6. 如果Bean实现了org.springframework.beans.factory.BeanBaneAware接口则将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中;
  7. 如果Bean实现了org.springframework.beans.factory.BeanFactoryAware接口,则将调用setBeanFactory()接口方法,将BeanFactory容器实例设置到Bean中;
  8. 如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则将调用BeanPostProcessor的Object postProcesBeforeInitializaton(Object bean,String beanName)接口方法对Bean进行加工操作。其中,入参bean是当前正在处理的Bean,而beanName是当前的配置名,返回的对象为加工处理后的Bean。用户可以使用该方法对某些Bean进行特殊的处理,甚至改变Bean的行为。BeanPostProcessor在Spring框架中占有重要的地位,为容器提供对Bean进行后续加工处理的切入点,Spring容器所提供的各种"神奇功能"(AOP、动态代理等)都是通过BeanPostProcessor实施的;
  9. 如果Bean实现了InitializingBean接口,则将调用接口的afterPropertiesSet()方法;
  10. 如果配置文件中通过init-method属性定义了初始化方法,则将执行这个方法;
  11. BeanPostProcessor后处理器定义了两个方法:其一是postProcessBeforeInitialization(),在第8步调用;其二是Object postProcessAfterInitialization(Object bean,String beanName),这个方法在此时调用,容器将再次获取对Bean进行加工处理的机会;
  12. 如果配置文件中指定Bean的作用范围为scope="prototype",则将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不在管理这个Bean的生命周期;如果将作用范围设置为scope="singleton",则将Bean放入Spring IoC容器的缓存池中,并将Bean引用返回调用者,Spring继续对这些Bean进行后续的生命管理;
  13. 对于scope="singleton"的Bean(默认情况),当容器关闭时,将触发Spring对Bean后续生命周期的管理工作。如果Bean实现了DisposableBean接口,则将调用接口的destory()方法,可以在此编写释放资源、记录日志等操作;
  14. 对于scope="singleton"的Bean,如果通过配置文件中的destory-method属性指定了Bean的销毁方法,那么Spring将执行Bean的这个方法,完成Bean资源的释放等操作。

Bean的生命周期说明

Bean的完整生命周期从Spring容器着手实例化Bean开始,知道最终销毁Bean。其中经过了许多关键点,每个关键点都涉及特定的方法调用,可以将这些防范大致划分为4类:

  1. Bean自身的方法:如调用Bean构造函数实例化Bean
  2. Bean级生命周期接口方法:如BeanNameAware、BeanFactoryAware、InititalizingBean和DisposableBean,这些接口方法由Bean类直接实现;
  3. 容器级生命周期接口方法:一般不由Bean本身实现,独立于Bean,实现类以容器附加装置的形式注册到Spring中,并通过接口反射为Spring容器扫描识别。其影响是全局性的,因为Spring容器创建任何Bean的时候,这些后处理器都会发生作用。
  4. 工厂后处理器接口方法:包括AspectJWeavingEnabler、CustomAutowireConfigurer、ConfigurationClassPostPrecessor等方法。工厂后处理器也是容器级的,在应用上下文装配配置文件后立即调用。

Bean级生命周期接口和容器级生命周期接口是个性和共性辩证统一思想的体现,前者解决Bean个性化处理的问题,而后者解决容器中某些Bean共性化处理的问题。

BeanFactory中Bean的生命周期的更多相关文章

  1. spring BeanFactory及ApplicationContext中Bean的生命周期

    spring bean 的生命周期 spring BeanFactory及ApplicationContext在读取配置文件后.实例化bean前后.设置bean的属性前后这些点都可以通过实现接口添加我 ...

  2. ApplicationContext中Bean的生命周期

    引言 Bean应用上下文中的生命周期和在BeanFactory中生命周期类似,不同的是,如果Bean实现了org.springframework.context.ApplicationContextA ...

  3. (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期

    日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...

  4. JAVA面试题:Spring中bean的生命周期

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...

  5. 深入理解Spring中bean的生命周期

    [Spring中bean的生命周期] bean的生命周期 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例 ...

  6. Spring中Bean的生命周期及其扩展点

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...

  7. 简:Spring中Bean的生命周期及代码示例

    (重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...

  8. 通过BeanPostProcessor理解Spring中Bean的生命周期

    通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...

  9. 一分钟掌握Spring中bean的生命周期!

    Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean 的别名只能维持 ...

随机推荐

  1. 使用Java代码自定义Ribbon配置

    很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...

  2. Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript

    Java 8 Nashorn JavaScript Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java ...

  3. Spring @Pathvariable

    先记录下@PathVariable的用法吧: @RequestMapping("/demo/{id}") @ResponseBody public User getUser(@Pa ...

  4. netty源码解解析(4.0)-15 Channel NIO实现:写数据

    写数据是NIO Channel实现的另一个比较复杂的功能.每一个channel都有一个outboundBuffer,这是一个输出缓冲区.当调用channel的write方法写数据时,这个数据被一系列C ...

  5. InnoDB存储引擎概览

    InnoDB存储引擎概览   InnoDB存储引擎以其平衡了高可靠性和高性能性而闻名遐迩,在MySQL 8.0版本中,InnoDB存储引擎是默认的存储引擎.(历史追溯从MySQL 5.5.5版本开始, ...

  6. .10-浅析webpack源码之graceful-fs模块

    在cachedInput.output.watch三大文件系统中,output非常简单,没有必要讲,其余两个模块依赖于input模块,而input主要是引用了graceful-fs的部分API,所以这 ...

  7. [转]Angular2 Material2 封装组件 —— confirmDialog确定框

    本文转自:https://www.jianshu.com/p/0c566fc1730d 环境: Angular 4.0.0 Angular2 Material2 2.0.0-beta.3 node v ...

  8. UML速记

    依赖:虚线箭头 关联:实线箭头 接口:虚线三角 父类:实线三角 聚合:空心菱形 组合:实心菱形 顺着箭头方向: 依赖于和什么关联是什么的子类是什么的接口的实现是什么的聚合是什么的组合

  9. JS 中的 __proto__ 、prototype、constructor

    首先 先解释这三个属性: (1) prototype  : 它是函数独有的,从一个函数指向一个对象(函数的原型),含义是函数的原型对象,也就是这个函数所创建的实例的原型对象.(普通函数的该属性没有作用 ...

  10. BZOJ1278: 向量vector(计算几何 随机化乱搞)

    题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...