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 ...
随机推荐
- 内存管理-slab[代码]
主要介绍kmalloc和kfree代码流程,侧重kmalloc和kfree流程中锁使用规则,会引用到cpuset,mempolicy(内存策略),numa相关知识.如果读起来比较困难可以参考另一篇随笔 ...
- 记一次sentry部署过程
本文记录下部署sentry和其中遇到的问题 Sentry 是一款基于 Django实现的错误日志收集和聚合的平台,它是 Python 实现的,但是其日志监控功能却不局限于python,对诸如 Node ...
- 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 1.Programming assignments:Building a recurrent neural network - step by step
Building your Recurrent Neural Network - Step by Step Welcome to Course 5's first assignment! In thi ...
- 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 0.Practice questions:Recurrent Neural Networks
[解释] It is appropriate when every input should be matched to an output. [解释] in a language model we ...
- list源码1(参考STL源码--侯捷):list节点、迭代器、数据结构
list源码1(参考STL源码--侯捷):list节点.迭代器.数据结构 list源码2(参考STL源码--侯捷):constructor.push_back.insert list源码3(参考STL ...
- 以ActiveMQ为例JAVA消息中间件学习【1】
前言 在慢慢的接触大型的javaweb的项目就会接触到很多的中间件系统. 其中消息中间件在很多场景下会被运用. 这里主要就对最近所学习到的消息中间件知识做一个笔记,为以后的实际运用打下一个良好的基础. ...
- Lucene 7.2.1 自定义Analyzer和TokenFilter
1.自定义Analyzer: @Test public void t01() throws Exception { ArrayList<String> strings = new A ...
- win7下安装mongodb
1.下载mongodb,解压2.新建路径,如D:\mongodb,将解压出来的bin目录复制到该目录下3.在D:\mongodb目录下在新建data目录,在data目录下新建两个目录:db和log.4 ...
- BBWebImage 设计思路
BBWebImage 设计思路 BBWebImage 是高性能 Swift 图片组件,用于图片下载.缓存.编解码.编辑与展示. GitHub 地址: https://github.com/Silenc ...
- Lucene实战之基于StandardAnalyzer读写索引
前言 使用lucene创建索引时如果指定了解析器,则需要读写都使用这个解析器,目前我发现也就是在处理中文这块比较麻烦,像你在使用solr时如果配置了ik分词,则需要把index清空重新创建才能继续搜索 ...