spring-beans模块分析

描述:spring-beans负责实现Spring框架的IOC模块

UML结构图如下:

在这里插入图片描述

AbstractBeanFactory:BeanFactory接口的抽象实现类,提供了ConfigurableBeanFactory 完整SPI。
通过DefaultSingletonBeanRegistry实现了单例缓存(singleton cache).
实现了通过FactoryBean判断bean类型(singleton/prototype)功能,处理,别名和合并bean definition功能,创建,获取和销毁bean对象功能,内部引用了parentBeanFactory对象,实现了BeanFactory的双亲委派结构

核心方法:

1.createBean

整体流程如下:
在这里插入图片描述
resloveBeanClass具体实现:返回RootBeanDefinition对象的beanClass属性或者其他的classloader根据RootBeanDefinition对象的beanClassName属性解析出的Class<?>

resloveBeforeInstantiation具体实现:遍历beanFactory对象的beanPostProcessors列表两次,对当前bean分别递归调用beanPostProcessor接口的postProcessBeforeInstantiation(转化为InstantiationAwareBeanPostProcessor类型)和 postProcessAfterInitialization方法(上一次接口调用的返回值作为下一次接口调用的请求)

doCreateBean具体实现:
在这里插入图片描述
createBeanInstance具体实现如下:

1.如果RootBeanDefinition对象定义了instanceSupplier属性,返回instanceSupplier.get()

2.如果RootBeanDefinition对象的factoryMethodName属性不为空,返回通过factoryMethod方法构造的实例

3.如果RootBeanDefinition对象的resolvedConstructorOrFactoryMethod属性不为空,返回通过特定方式构造的实例

4.遍历beanPostProcessor(转化为SmartInstantiationAwareBeanPostProcessor)列表,使用determineCandidateConstructors(beanClass, beanName)获取特定构造器,返回特定构造器返回的实例

5.返回无参构造器

AbstractApplicationContext:org.springframework.context.ApplicationContext接口的抽象实现,用于创建或者刷新IOC容器

核心方法:

1.refresh

创建或者刷新IOC容器

执行流程如下:
在这里插入图片描述
1.1 prepareBeanFactory详解

流程如下:
在这里插入图片描述
1.2 invokeBeanFactoryPostProcessors详解

流程如下:
在这里插入图片描述
备注:如果beanFactory是BeanDefinitionRegistry类型的话,在beanFactoryPostProcessors和beanFactory查找BeanDefinitionRegistryPostProcessor类型,并执行相应方法

1.3 登记ApplicationListener对象

ApplicationListener类型UML结构图如下:
在这里插入图片描述
1.4 初始化BeanFactory中定义的singleton对象

AbstractRefreshableApplicationContext:默认使用DefaultListableBeanFactory类型

AbstractRefreshableWebApplicationContext:面向web环境的ApplicationContext,主要涉及到ServletContext和ServletConfig

ServletContextAwareProcessor:

备注:将bean转换为ServletContextAware类型,并设置对应ServletContext和ServletConfig参数

XmlWebApplicationContext:使用xml配置加载bean对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark-streaming first insight

一、 Spark Streaming 构建在Spark core API之上&#xff0c;具备可伸缩&#xff0c;高吞吐&#xff0c;可容错的流处理模块。 1&#xff09;支持多种数据源&#xff0c;如Kafka&#xff0c;Flume&#xff0c;Socket&#xff0c;文件等&#xff1b; Basic sources: Sources dir…

DHCP服务器 出现的故障

系统版本&#xff1a;Windows Server 2008 R2 Standard 故障现象&#xff1a;近段时间&#xff0c;我们核心网络DHCP服务器&#xff0c;总是发现有掉线重起现象&#xff0c;大约每10分钟至30分钟不定时会重起。 故障代码&#xff1a;关键系统进程 C:\Windows\system32\lsass.ex…

双亲委派

双亲委派模式的工作原理的是:如果一个类加载器收到了类加载请求&#xff0c;它并不会自己先去加载&#xff0c;而是把这个请求委托给父类的加载器去执行&#xff0c;如果父类加载器还存在其父类加载器&#xff0c;则进一步向上委托&#xff0c;依次递归&#xff0c;请求最终将到…

程序设计入门-C语言基础知识-翁恺-第六周:数组-详细笔记(六)

目录 第六章&#xff1a;数组6-1 数组6-2 数组计算6.3 课后习题第六章&#xff1a;数组 6-1 数组 题目&#xff1a;让用户输入一组整数以-1结束输入&#xff0c;算出这组数的平均值&#xff0c;并且输出大于平均值的数。 我们需要记录用户所有输入的数字才能在判断出平均值后输…

Vue学习【第六篇】:Vue-cli脚手架(框架)与实战案例

环境搭建 安装node 官网下载安装包&#xff0c;傻瓜式安装&#xff1a;https://nodejs.org/zh-cn/ 安装cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装脚手架 cnpm install -g vue/cli 清空缓存处理 npm cache clean --force 项目的创建 创建项目 v…

Docker安装配置教程

Docker安装配置教程

Python学习第十六篇——异常处理

在实际中&#xff0c;很多时候时候&#xff0c;我们并不能保证我们所写的程序是完美的。比如我们程序的本意是&#xff1a;用户在输入框内输入数字&#xff0c;并进行后续数学运算&#xff0c;即使我们提醒了用户需要输入数字而不是文本&#xff0c;但是有时会无意或者恶意输入…

cmd 常用命令

注&#xff1a;绿色的为比较常用的命令 命令名称ASSOC 显示或修改文件扩展名关联。ATTRIB显示或更改文件属性。BREAK 设置或清除扩展式 CTRLC 检查。CACLS显示或修改文件的访问控制列表(ACL)。BCDEDIT 设置启动数据库中的属性以控制启动加载。CALL从另一个批处理程序调用这一个…

js打字的效果

HTML代码&#xff1a; <div id"box"></div> javascript代码&#xff1a; var index 0; var word "8月6日美国的经济“制裁”如约而至&#xff0c;特朗普在社交网站发文称&#xff0c;对伊朗的制裁已经正式实施&#xff0c;他称这是“有史以来最激…

递归函数实现二分查找法

最初版本&#xff1a; 改进版&#xff1a; 最终版本&#xff1a; 递归实现阶乘&#xff1a; 转载于:https://www.cnblogs.com/www-qcdwx-com/p/10399288.html

图解LinkedHashMap原理

1 前言 LinkedHashMap继承于HashMap&#xff0c;如果对HashMap原理还不清楚的同学&#xff0c;请先看上一篇&#xff1a;图解HashMap原理 2 LinkedHashMap使用与实现 先来一张LinkedHashMap的结构图&#xff0c;不要虚&#xff0c;看完文章再来看这个图&#xff0c;就秒懂了…

02、体验Spark shell下RDD编程

02、体验Spark shell下RDD编程 1、Spark RDD介绍 RDD是Resilient Distributed Dataset&#xff0c;中文翻译是弹性分布式数据集。该类是Spark是核心类成员之一&#xff0c;是贯穿Spark编程的始终。初期阶段&#xff0c;我们可以把RDD看成是Java中的集合就可以了&#xff0c;在后…

CDH集群安装配置(四)- mysql 的安装

安装mysql&#xff0c;并且创建相关的表&#xff08;只需要在chd1上面安装而且需要root权限&#xff09;1.1 查看Centos自带mysql是否已经安装 yum list installed | grep mysql 卸载自带mariadb# rpm -qa | grep mariadb mariadb-libs-5.5.41-2.el7_0.x86_64 # rpm -e --nodep…

EF另一个 SqlParameterCollection 中已包含 SqlParameter。

代码&#xff1a; SqlParameter[] commandParameters new SqlParameter[]{new SqlParameter("CultID",filters.ParentID)};var result db.Database.SqlQuery<FM_PlantSolutions>("select s.* ,u.UserName as PrincipalName,isnull(ue.UserName,无) as E…

2019 GUDT RC 2 Problem C(题解)

原题 题目大意 这道题的背景是农夫和牛爬山,给出山的高度L,农夫会从山底以rF的速度爬山,中途不会休息,牛会从山底以rB的速度爬山,可以在休息站休息并吃草,在第i个休息站休息ti时间,牛可以吃t*ci的草,第i个休息站的高度为xi.农夫和牛同时出发,要求牛在不被农夫追上的同时吃最多的…

maven setting.xml 中文配置详解(全配置)

<?xml version"1.0" encoding"UTF-8"?> <!--| 官方文档: https://maven.apache.org/settings.html|| Maven 提供以下两种 level 的配置:|| 1. User Level. 当前用户独享的配置, 通常在 ${user.home}/.m2/settings.xml 目录下。 | …

String/Stringbuilder/StringBuffer

三个的运行速度&#xff1a;Stringbuilder>Stringbuffer>String String最慢是因为它是字符串常量&#xff0c;而其他两个是字符串变量。其中stringbuilder是非线程安全的、stringbuffer是线程安全的Stringbuilder适用于单线程且数据量大的字符串操作Stringbuffer适用于多…

CCF 差分约束--201809再卖菜

问题描述 在一条街上有n个卖菜的商店&#xff0c;按1至n的顺序排成一排&#xff0c;这些商店都卖一种蔬菜。   第一天&#xff0c;每个商店都自己定了一个正整数的价格。店主们希望自己的菜价和其他商店的一致&#xff0c;第二天&#xff0c;每一家商店都会根据他自己和相邻商…

Express + Element-ui 实现图片/文件上传

使用第三方插件 formidable 处理表单数据/文件 Express 4 以前&#xff0c;我们通常使用 req.files 来对请求中的文件进行处理&#xff0c;但在 Express 4 中这种用法已经被抛弃&#xff0c;默认情况下 req.files 在 req 对象上不再可用。官方推荐我们使用第三方中间件。 在这里…