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的生命周期的更多相关文章

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

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

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

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

  3. IoC基础篇(一)--- Spring容器中Bean的生命周期

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

  4. Spring 容器中 Bean 的生命周期

    Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...

  5. ApplicationContext中Bean的生命周期

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

  6. spring框架中Bean的生命周期

    一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...

  7. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  8. 好记性不如烂笔头86-spring3学习(7)-ApplicationContext中bean的生命周期

    假设使用ApplicationContext来生成.管理Bean, 一个Bean从建立到销毁,会历经几个运行阶段. 我个人理解一般的bean的生命周期主要包含:建立,初始化,使用阶段,销毁四个核心阶段 ...

  9. 解释Spring框架中bean的生命周期?

    Spring容器 从XML 文件中读取bean的定义,并实例化bean. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean ...

随机推荐

  1. 第五篇: 路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...

  2. 程序性能调优工具之gprob

    1 简介改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程序中是哪些函数消耗掉了大部分执行时间,这通常都不是非常明显的.GNU 编译器工具包所提供了一种剖析工具 GNU profiler(gpro ...

  3. .NET手记-Autofac进阶(属性和方法注入 Property and Method Injection)

    尽管构造函数参数注入是传递参数值给当前构造的组件的优先方式,但是你也可以使用属性或者方法注入来提供参数值. 属性注入使用可写入的变量而不是构造函数参数来完成注入.方法注入则通过方法来设置依赖项. 属性 ...

  4. Windows10开发手记-RelativePanel使用详解

    Windows 10已于7月29号面向全球发布,同时Universal Windows Platform(UWP) SDK也已正式放出,配合VS 2015我们可以开发出通用的Windows App. ...

  5. hdu 6058---Kanade's sum(链表)

    题目链接 Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th largest elem ...

  6. (转)mtr命令详解诊断网络路由

    原文:https://blog.51cto.com/6226001001/1941355 http://www.zzbiji.com/2212.html----Linux下使用mtr做路由图进行网络分 ...

  7. error: device unauthorized —— android studio 链接不上虚拟机

    问题原因: 以前用Eclipse开发的时候在环境变量里配置了ANDRIOD_SDK_HOME. 解决方法: 将电脑环境变量中的ANDRIOD_SDK_HOME删除,重新运行adb devices,手机 ...

  8. Hadoop2源码分析-HDFS核心模块分析

    1.概述 这篇博客接着<Hadoop2源码分析-RPC机制初识>来讲述,前面我们对MapReduce.序列化.RPC进行了分析和探索,对Hadoop V2的这些模块都有了大致的了解,通过对 ...

  9. Ubuntu Docker版本的更新与安装

    突然发现自己的docker版本特别的低,目前是1.9.1属于古董级别的了,想更新一下最新版本,这样最新的一下命令就可以被支持.研究了半天都没有更新成功,更新后的版本始终都是1.9.1 :查阅了官网资料 ...

  10. CynosDB技术详解——存储集群管理

    本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM: ...