spring ApplicationContext中Bean的生命周期
AbstractApplicationContext
Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法定义了spring容器在加载配置文件后的各项处理过程
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
prepareRefresh();
// 初始化BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
try {
postProcessBeanFactory(beanFactory);
/**
* 调用工厂后处理器:
* 根据反射机制找出所有实现了BeanFactoryPostProcessor接口的Bean,
* 并调用其postProcessBeanFactory()接口方法
*/
invokeBeanFactoryPostProcessors(beanFactory);
/**
* 注册Bean后处理器:
* 根据反射机制找出所有实现了BeanPostProcessor接口的Bean,
* 并注册
*/
registerBeanPostProcessors(beanFactory);
// 初始化消息源:初始化容器的国际化消息资源
initMessageSource();
// 初始化Application事件广播器
initApplicationEventMulticaster();
// 初始化其他特殊的Bean,由具体子类实现
onRefresh();
// 注册事件监听器
registerListeners();
// 初始化所有单例的Bean,使用懒加载的除外
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
AbstractApplicationContext源码
1、ResourceLoader加载配置信息,并使用Resource表示配置文件
2、BeanDefinitionReader读取Resource的配置文件,并解析配置文件——把配置文件中的每个<bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。
BeanDefinition接口有一个抽象类AbstractBeanDefinition,AbstractBeanDefinition有两个实现类,ChildBeanDefinition和RootBeanDefinition。
在xml配置文件中,可以定义父<bean>和了<bean>,父<bean>用RootBeanDefinition来表示,子<bean>用ChildBeanDefinition表示;没有父<bean>的<bean>直接使用RootBeanDefinition表示;AbstractBeanDefinition对二者共同的类信息进行抽象。
3、容器扫描所有的BeanDefinition,使用反射机制识别出Bean工厂后处理器——即实现了BeanFactoryPostProcessor接口的bean,并调用这些Bean工厂后处理器的postProcessBeanFactory方法对BeanDefinition进行加工处理,主要完成以下两项任务:
a.解析使用占位符的<bean>元素,得到配置值
b.扫描所有的BeanDefinition,通过java反射机制找出所有属性编辑器的bean——即实现了java.beans.PropertyEditor接口的bean,并将它们注册到spring的属性编辑器注册表中。
4、调用InstantiationStrategy实例化bean
这里用到了策略模式:InstantiationStrategy接口有一个实现类SimpleInstantiationStrategy,SimpleInstantiationStrategy又有一个实现类CglibSubclassingInstantiationStrategy;SimpleInstantiationStrategy是最常用到的实例化策略;CglibSubclassingInstantiationStrategy利用CGLib为bean动态生成子类,在子类中生成方法注入的逻辑以支持方法注入,然后使用这个动态生成的子类创建Bean的实例。
5、实例化bean后,容器主程序调用BeanWrapper的setWrapperInstance(Object obj)方法把实例化后的bean传递到BeanWrapper里。
6、BeanWrapper结合BeanDefinition、属性编辑器完成属性注入
7、使用Bean后处理器——实现了BeanPostProcessor接口的bean,对bean进行后续加工——SpringAOP就是在这里实现的。
spring ApplicationContext中Bean的生命周期的更多相关文章
- spring BeanFactory及ApplicationContext中Bean的生命周期
spring bean 的生命周期 spring BeanFactory及ApplicationContext在读取配置文件后.实例化bean前后.设置bean的属性前后这些点都可以通过实现接口添加我 ...
- (spring-第1回【IoC基础篇】)Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- IoC基础篇(一)--- Spring容器中Bean的生命周期
日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此 ...
- Spring 容器中 Bean 的生命周期
Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...
- ApplicationContext中Bean的生命周期
引言 Bean应用上下文中的生命周期和在BeanFactory中生命周期类似,不同的是,如果Bean实现了org.springframework.context.ApplicationContextA ...
- spring框架中Bean的生命周期
一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- 好记性不如烂笔头86-spring3学习(7)-ApplicationContext中bean的生命周期
假设使用ApplicationContext来生成.管理Bean, 一个Bean从建立到销毁,会历经几个运行阶段. 我个人理解一般的bean的生命周期主要包含:建立,初始化,使用阶段,销毁四个核心阶段 ...
- 解释Spring框架中bean的生命周期?
Spring容器 从XML 文件中读取bean的定义,并实例化bean. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean ...
随机推荐
- vue环境安装
node.js安装 https://nodejs.org/en/ cnpm安装 npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- Build step 'Execute shell' marked build as failure解决
今天jenkins构建时运行脚本报错如下: Build step 'Execute shell' marked build as failure 脚本没问题后来看了下原因是磁盘空间不足导致报错,清除下 ...
- 我是如何利用Github Pages搭建起我的博客,细数一路的坑
1.前言 其实早在这之前我就一直想过写博客,但由于种种原因一直没有去学习这方面的知识,最近半个月(从开始动手到搭建好)一直陆陆续续的在着手这方面的工作.从开始到搭建完成的过程中遇到了很多困难,因为在这 ...
- C#单元测试分享ppt
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类, ...
- sql server 备份与恢复系列八 系统数据库备份与恢复分析
一.概述 在前面讲过"sql server 备份与恢复系列"都是集中在用户数据库上.sql server还维护着一组系统数据库,这些系统数据库对于服务器实例的运行至关重要.在每次进 ...
- 读书笔记(06) - 语法基础 - JavaScript高级程序设计
写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...
- 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)
前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...
- 通过反射实现IOC功能
这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...
- xmldocument内嵌入另一个xmldocument,xmlnode的方法
string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...
- python学习笔记01--基础
一.解释型语言 python是一门解释型语言,这意味着: l 编写过后的代码不用编译连接即可运行,节约调试时间 l python的解释器在大多数系统中都有很好实现,所以编写的代码可以运行在任何系统 ...