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 容器 ...
随机推荐
- 程序语言与编程实践4-> 蓝桥杯C/C++备赛记录2 | 第二周学习训练
0323,又是一周星期三,按道理该总结了.这周前几天写题比较多,后面事情多了起来,就没怎么写了.主要方向是洛谷的基本语法熟悉,PTA平台数据结构的一些题目. 0323附上: 题目比较多,所以文章可能有 ...
- 【网鼎杯2020青龙组】Web WriteUp
AreUSerialz 打开题目直接给出了源代码 <?php include("flag.php"); highlight_file(__FILE__); class Fil ...
- 不想业务被中断?快来解锁华为云RDS for MySQL新特性
摘要:新特性上线!华为云RDS for MySQL又添新技能,实力保障业务连续性. 本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:Gauss ...
- vue渐进式?
小到可以只使用核心功能,比如单文件组件作为一部分嵌入:大到使用整个工程,vue init webpack my-project来构建项目:VUE的核心库及其生态系统也可以满足你的各式需求(core+v ...
- 什么是MVC模式?
MVC (Model View Controller) 是一个设计模式,使用MVC应用程序被分成三个核心部件:模型.视图.控制器.它们各自处理自己的任务.M是指数据模型,V是指用户界面,C则是控制器. ...
- consumer 是推还是拉?
Kafka 最初考虑的问题是,customer 应该从 brokes 拉取消息还是 brokers 将消 息推送到 consumer,也就是 pull 还 push.在这方面,Kafka 遵循了一种大 ...
- mysql问题排查与性能优化
MySQL 问题排查都有哪些手段? 使用 show processlist 命令查看当前所有连接信息. 使用 explain 命令查询 SQL 语句执行计划. 开启慢查询日志,查看慢查询的 SQL. ...
- 解释Spring框架中bean的生命周期?
Spring容器 从XML 文件中读取bean的定义,并实例化bean. Spring根据bean的定义填充所有的属性. 如果bean实现了BeanNameAware 接口,Spring 传递bean ...
- AOP 有哪些实现方式?
实现 AOP 的技术,主要分为两大类: 静态代理 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类, 因此也称为编译时增强: 编译时编织(特殊编译器实现) 类加载时编织( ...
- Idea中使用Lombok 编译报找不到符号
1.问题描述 项目中使用了lombok,但是在idea编译过程是出现找不到符号.报错如下图所示: file @Data @ApiModel(value = "HeadTeacherVO& ...