Spring 源码 (1)Spring IOC Bean 创建的整体流程
Spring IOC 中涉及的重要接口
BeanDefinition
Bean的描述信息,实现类包括RootBeanDefinition和GenericBeanDefinition,Bean的描述信息中定义了一系列Bean的信息,比如:beanClassName、scope、lazyinit、dependsOn、primary、initMethodName、destroyMethodName、isSington、isAbstract等信息。BeanDefinitionReader用于解析
Bean的资源阅读器,比如针对于XML文件的配置的Bean,实现类XmlBeanDefinitionReader,针对properties文件的配置的Bean,实现类为PropertiesBeanDefinitionReader,Spring在启动时会将xml文件通过loadBeanDefinitions方法进行解析。BeanFactory
是IOC容器实现的顶层接口,默认的实现为DefaultListableBeanFactory,Spring Bean的整个生命周期都是由DefaultListableBeanFactory去管理的,这个类非常的重要。BeanFactoryPostProcessor这个接口是
BeanFactory的增强处理器,用于在Bean加载为BeanDefinition之后的扩展,比如实现类PlaceHolderConfigurerSupport就是用来处理占位符解析的,当我在xml文件中配置jdbc信息的时候,通过是用${xxx.jdbUrl}这种方式配置数据库连接的时候,就是通过这个类来处理和解析的。Aware这个接口,他下面有一堆的子接口,比如
BeanNameAware、ApplicationContextAware、BeanFactoryAware、EnvironmentAware等,可以通过实现这些接口完成ioc容器中特定信息的设置,比如EnvironmentAware,可以在Bean创建过程中设置环境信息到对应的Bean对象中,后期通过bean对象获取环境信息数据。BeanPostProcessor这个接口是
Bean的增强处理器,用于在Bean进行初始化时调用init-method方法的前后进行增强,他有两个方法:postProcessBeforeInitialization和postProcessAfterInitialization,分别用于bean初始化方法init-method之前和之后调用,当然还可以进行很多扩展,比如aop就是通过postProcessAfterInitialization方法中去创建动态代理对象。
Spring Bean 的生命周期

- 首先通过BeanDefinitionReader将xml中的Bean配置加载到BeanDefinition中
- 然后将BeanDefinition放入DefaultListableBeanFacotry的beanDefinitionMap和beanDefinitionNames集合中
- 然后调用BeanFactoryPostProcessor#postProcessorBeanFactory对容器中的BeanDefinition的属性进行增强解析
- 然后通过反射调用对象的构造函数进行对象的实例化
- 然后调用populateBean进行属性填充
- 然后调用初始化方法initializeBean,初始化时又会先调用invokeAwareMethods方法执行一堆的Aware方法
- 然后BeanPostProcessor#postProcessBeforeInitialization方法执行bean增强器的前置处理
- 然后调用InitializingBean#afterPropertiesSet方法或者是调用自定义的init-method方法
- 然后调用BeanPostProcessor#postProcessAfterInitialization方法执行bean增强的后置处理
- 最后完成Bean的创建,最终放入一级缓存singletonObjects中
整体流程大概就是这个,有了整体流程就可以进行下一步Bean创建的细节解读。
Spring 源码 (1)Spring IOC Bean 创建的整体流程的更多相关文章
- spring源码深度解析— IOC 之 开启 bean 的加载
概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spri ...
- 【spring源码分析】IOC容器初始化(总结)
前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...
- 【spring源码分析】IOC容器初始化(二)
前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...
- 【spring源码分析】IOC容器初始化(三)
前言:在[spring源码分析]IOC容器初始化(二)中已经得到了XML配置文件的Document实例,下面分析bean的注册过程. XmlBeanDefinitionReader#registerB ...
- 【spring源码分析】IOC容器初始化(四)
前言:在[spring源码分析]IOC容器初始化(三)中已经分析了BeanDefinition注册之前的一些准备工作,下面将进入BeanDefinition注册的核心流程. //DefaultBean ...
- 【spring源码分析】IOC容器初始化(七)
前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...
- 【spring源码分析】IOC容器初始化(十)
前言:前文[spring源码分析]IOC容器初始化(九)中分析了AbstractAutowireCapableBeanFactory#createBeanInstance方法中通过工厂方法创建bean ...
- 转 Spring源码剖析——核心IOC容器原理
Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...
- Spring源码分析专题 —— IOC容器启动过程(上篇)
声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...
随机推荐
- Debian与Ubuntu到底有什么不同,应该如何选择?
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 在CentOS转向CentOS Stream之后,这意味着它将变得不可靠. 但是幸好,仍然有非常优秀的Linux发行版本在等我们.其中比较有知名度 ...
- 4月9日 python学习总结 模块
1.XML模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融 ...
- CTF--这好像不是文件上传
打开题目F12看到一个被注释的跳转. 访问可以知道是一个文件包含 经过测试,该文件禁止了input.data关键字.并禁止了phar://协议. 使用php://filter读取题目源码得到 http ...
- 手把手带你使用EFR32 -- 土壤湿度传感器变身第二形态,以 ZigBee 形态出击
前言 后悔,总之就是非常后悔,我当时到底是为啥才会猪油蒙心,选择了 EFR32 来学习 ZigBee 使用啊? EFR32 这玩意看性能确实不错,但是资料太少了,EmberZnet SDK 也是用得一 ...
- Linux(centos7)安装RabbitMQ
由于RabbitMQ是由Erlang语言开发的,所以我们需要体检安装erlang语言的环境 下载这三个安装包:https://www.aliyundrive.com/s/4AxfTepHjMD 执行安 ...
- kafka的message格式是什么样的?
一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成 ...
- promethues常用的函数
prometheus函数常用 时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total区间数据 (Range vector): 包含一 ...
- 学习DNS(一)
DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串.通过主机名,最终得到该主 ...
- list集合的快速筛选条件方法
List<String> list = new ArrayList<>();list.add("张无忌");list.add("周芷若" ...
- ctfhub web信息泄露备份文件下载(vim缓存 Ds-Store)
Vim缓存 进入环境由于不懂得vim是什么借鉴大佬的博客 网页提示flag在index.php中我们按着这个思路去找 将文件保存下来因为是swp文件我们用kail进行打开 使用vim -r index ...