BeanFactory中Bean的生命周期
Bean的生命周期图解
集体过程如下:
- 当调用者通过getBean(beanName)向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前,将调用接口的postProcessBeforeInstantiation()方法;
- 根据配置情况调用Bean的构造函数或工厂方法实例化Bean;
- 如果容器注册了InstantiationAwareBeanPostProcessor接口,那么实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法,可在这里对已经实例化的对象进行一些"梳妆打扮";
- 如果Bean配置了属性信息,那么容器在这一步着手将配置值设置到Bean对引发的属性中,不过在设置每个属性之前将先调用InstantiationAwareBeanPostProcessor接口的postProcessPorpertyValues()方法;
- 调用Bean的属性设置方法设置属性值;
- 如果Bean实现了org.springframework.beans.factory.BeanBaneAware接口则将调用setBeanName()接口方法,将配置文件中该Bean对应的名称设置到Bean中;
- 如果Bean实现了org.springframework.beans.factory.BeanFactoryAware接口,则将调用setBeanFactory()接口方法,将BeanFactory容器实例设置到Bean中;
- 如果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实施的;
- 如果Bean实现了InitializingBean接口,则将调用接口的afterPropertiesSet()方法;
- 如果配置文件中通过init-method属性定义了初始化方法,则将执行这个方法;
- BeanPostProcessor后处理器定义了两个方法:其一是postProcessBeforeInitialization(),在第8步调用;其二是Object postProcessAfterInitialization(Object bean,String beanName),这个方法在此时调用,容器将再次获取对Bean进行加工处理的机会;
- 如果配置文件中指定Bean的作用范围为scope="prototype",则将Bean返回给调用者,调用者负责Bean后续生命的管理,Spring不在管理这个Bean的生命周期;如果将作用范围设置为scope="singleton",则将Bean放入Spring IoC容器的缓存池中,并将Bean引用返回调用者,Spring继续对这些Bean进行后续的生命管理;
- 对于scope="singleton"的Bean(默认情况),当容器关闭时,将触发Spring对Bean后续生命周期的管理工作。如果Bean实现了DisposableBean接口,则将调用接口的destory()方法,可以在此编写释放资源、记录日志等操作;
- 对于scope="singleton"的Bean,如果通过配置文件中的destory-method属性指定了Bean的销毁方法,那么Spring将执行Bean的这个方法,完成Bean资源的释放等操作。
Bean的生命周期说明
Bean的完整生命周期从Spring容器着手实例化Bean开始,知道最终销毁Bean。其中经过了许多关键点,每个关键点都涉及特定的方法调用,可以将这些防范大致划分为4类:
- Bean自身的方法:如调用Bean构造函数实例化Bean
- Bean级生命周期接口方法:如BeanNameAware、BeanFactoryAware、InititalizingBean和DisposableBean,这些接口方法由Bean类直接实现;
- 容器级生命周期接口方法:一般不由Bean本身实现,独立于Bean,实现类以容器附加装置的形式注册到Spring中,并通过接口反射为Spring容器扫描识别。其影响是全局性的,因为Spring容器创建任何Bean的时候,这些后处理器都会发生作用。
- 工厂后处理器接口方法:包括AspectJWeavingEnabler、CustomAutowireConfigurer、ConfigurationClassPostPrecessor等方法。工厂后处理器也是容器级的,在应用上下文装配配置文件后立即调用。
Bean级生命周期接口和容器级生命周期接口是个性和共性辩证统一思想的体现,前者解决Bean个性化处理的问题,而后者解决容器中某些Bean共性化处理的问题。
BeanFactory中Bean的生命周期的更多相关文章
- spring BeanFactory及ApplicationContext中Bean的生命周期
spring bean 的生命周期 spring BeanFactory及ApplicationContext在读取配置文件后.实例化bean前后.设置bean的属性前后这些点都可以通过实现接口添加我 ...
- ApplicationContext中Bean的生命周期
引言 Bean应用上下文中的生命周期和在BeanFactory中生命周期类似,不同的是,如果Bean实现了org.springframework.context.ApplicationContextA ...
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- JAVA面试题:Spring中bean的生命周期
Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一 ...
- 深入理解Spring中bean的生命周期
[Spring中bean的生命周期] bean的生命周期 1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例 ...
- Spring中Bean的生命周期及其扩展点
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6106456.html Spring中Bean的管理是其最基本的功能,根据下面的图来了解Spr ...
- 简:Spring中Bean的生命周期及代码示例
(重要:spring bean的生命周期. spring的bean周期,装配.看过spring 源码吗?(把容器启动过程说了一遍,xml解析,bean装载,bean缓存等)) 完整的生命周期概述(牢记 ...
- 通过BeanPostProcessor理解Spring中Bean的生命周期
通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 Spring源码解析(十一)Spring扩展接口InstantiationAwareBeanPostProces ...
- 一分钟掌握Spring中bean的生命周期!
Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean 的别名只能维持 ...
随机推荐
- String 字符串中含有 Unicode 编码时,转为UTF-8
1.单纯的Unicode 转码 String a = "\u53ef\u4ee5\u6ce8\u518c"; a = new String(a.getBytes("UTF ...
- mysql 循环
DELIMITER $$ DROP PROCEDURE IF EXISTS student_insert_while; $$ ), in birthday date, in age int) begi ...
- 第4章 ext文件系统机制原理剖析
将磁盘进行分区,分区是将磁盘按柱面进行物理上的划分.划分好分区后还要进行格式化,然后再挂载才能使用(不考虑其他方法).格式化分区的过程其实就是创建文件系统. 文件系统的类型有很多种,如CentOS 5 ...
- Linux NFS存储服务部署
什么是NFS 中文意思是网络文件系统,主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录 NFS属于本地文件存储服务 缺点1: 1 2 3 4 5 6 7 windows上无法使用 ...
- C# 分支语句 练习题(中间变量,随机数)
练习一 请输入年份:”(1-9999),请输入月份:”(1-12),请输入日期(要判断大小月,判断闰年),判断输入的时间日期是否正确. 计算输入的时间是当前这一年的第几天. bool dateISOK ...
- Java框架之Spring(三)
本文主要介绍Spring中, 1 Bean 的 init-method 和 destroy-method 2 集合类型的装配 3 注解方式装配 4 以自动扫描把组件纳入spring容器中管理 5 代理 ...
- Nginx学习笔记(一)---Linux下安装Nginx
1.Nginx介绍 (来自百度,相当之抽象,主要看后面看实例) 2.准备工作 2.1 Nginx安装 官方网站:http://nginx.org/ 2.2.Linux安装 安装工程可参考博客https ...
- Python 函数的作用域
python中的作用域有4种: 名称 介绍 L local,局部作用域,函数中定义的变量: E enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: B ...
- csharp: mappings using Dapper-Extensions+Dapper.net.
sql: CREATE TABLE [PotoUsers] ( [UserID] INT IDENTITY(1,1) PRIMARY KEY, [UserName] NVARCHAR(50), [Fi ...
- 洛谷P1742 最小圆覆盖(计算几何)
题意 题目链接 Sol 暴力做法是\(O(n^3)\)枚举三个点然后check一下是否能包含所有点 考虑一种随机算法,首先把序列random_shuffle一下. 然后我们枚举一个点\(i\),并维护 ...