读spring源码(三)-ClassPathXmlApplicationContext-getBean

这次主要看了下bean的生成过程,发现个画时序图很好用的软件plantuml,充分发挥程序员的能力,能用代码解决的别叨叨别的??

1、调用ApplicationContext的genBean方法会调用到AbstractApplicationContext的getBean方法,这个方法里面其实就是交由BeanFactory调用getBean

2、DefaultListableBeanFactory中会先根据类型获取beanNames,然后根据beanName调用AbstractBeanFactory的doGetBean方法

3、AbstractBeanFactory中首先转化beanName,然后看去缓存map中看是否存在已有数据,第一次调用肯定返回null。然后去获取RootBeanDefinition,获取DependsOn依赖的bean,如果存在依赖Bean需要先初始化依赖的bean,之后调用getSingleton方法来获取单例类

4、在DefaultSingletonBeanRegistry#getSingleton中又调用ObjectFactory#getObject来获取对象,这个函数里面主要调用了createBean来生成对象

5、AbstractAutowireCapableBeanFactory#createBean

  5.1、resolveBeanClass根据BeanDefinition获取Bean的类并加载

  5.2、doCreateBean-->createBeanInstance这里会获取Bean的构建方法,并根据是否有构建方法,是否有构建参数最终bean的构建方式

5.3、autowireConstructor会构建ConstructorResolver来构建Bean

6、ConstructorResolver#autowireConstructor,从BeanDefinition中获取构建参数,之后根据Bean的class获取已有的构造函数并根据构造参数值获取相匹配的构造函数,之后就是调用SimpleInstantiationStrategy#instantiate方法,这个方法里面其实就是调用BeanUtils.instantiateClass(ctor, args)方法,利用java的反射机制来构建一个对象,到此就得到了需要构建的对象

7、之后再AbstractAutowireCapableBeanFactory中会调用bean相关的PostProcessor,之后会调用populateBean方法

8、populateBean这个方法会判断Bean是否autowire,如果是的话会进行自动注入,最后会调用applyPropertyValues方法,这个方法看名字也很好理解,就是对配置的属性值进行写入。到这里这个Bean的构建基本全部完成了,后续就是将Bean写入缓存Map,注册单例类等操作。

原文地址:https://www.cnblogs.com/lcxdever/p/9501517.html

时间: 2024-10-15 16:01:47

读spring源码(三)-ClassPathXmlApplicationContext-getBean的相关文章

spring源码系列——spring循环引用

众所周知spring在默认单例的情况下是支持循环引用的 Appconfig.java类的代码 @Configurable@ComponentScan("com.shadow")public class Appconfig {}1234X.java类的代码 package com.shadow.service; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.

Spring 源码学习(二)

容器概述 IoC也被称作依赖注入(DI).它是一个处理对象依赖项的过程,也就是将他们一起工作的其他的对象,只有通过构造参数.工厂方法参数或者(属性注入)通过构造参数实例化或通过工厂方法返回对象后再设置属性.当创建bean后,IoC容器再将这些依赖项注入进去.这个过程基本上是反转的,因此得名控制反转(IoC). 下图是 IoC 的高级别视图 IoC容器利用Java的POJO类和配置元数据来生成 完全配置和可执行 的系统或应用程序.而Bean在Spring中就是POJO,也可以认为Bean就是对象.

【学习底层原理系列】重读spring源码1-建立基本的认知模型

开篇闲扯 在工作中,相信很多人都有这种体会,与其修改别人代码,宁愿自己重写. 为什么? 先说为什么愿意自己写: 从0-1的过程,是建立在自己已有认知基础上,去用自己熟悉的方式构建一件作品.也就是说, 1.对目标的认知是熟悉的(当然每个人水平可能不一样,也有可能是错的,这不重要,重要的是自认为是符合的): 2.使用的工具是自己熟悉的. 接下来就是去做一件自己熟悉的领域的事而已. 再说为什么不愿意修改别人代码: 1.首先要在阅读代码过程中,去不断的检视对方的实现是否符合自己的认知,很可能由于双方认识

【Spring源码分析】Bean加载流程概览

代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口. 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 ApplicationContext ac = new Clas

Spring源码研究--下载-编译-导入eclipse-验证

一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直接clone Spring源码到本地:git clone git://github.com/SpringSource/spring-framework.git 2,编译 编译过程,这里所谓的编译是通过gradle工具编译Spring-framework的项目文件,主要干的事情就是下载Spring各个

Spring 源码阅读–beans

最近买了本书,来大概学习写spring源码 一:先来段代码来测试一下. 照书上的先来试试 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schem

spring源码--容器的基本实现

在工作中见得非常多的容器使用是: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:jee="http://www.springfra

Spring源码分析(二十四)初始化非延迟加载单例

摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 完成BeanFactory的初始化工作,其中包括ConversionService的设置.配置冻结以及非延迟加载的bean的初始化工作. /** * Finish the initialization of this context's bean factory, * initializing all remaining singleton beans. */ protecte

spring源码-自定义标签-4

一.自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展.通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注.这也是spring对于配置拓展的一个很重要的方式. 二.自定义标签的几个步骤:1.创建可扫描的标签和对应的解析类  2.读取页面元素解析 3.加入容器管理 三.涉及到的常用类:BeanDefinitionParser.NamespaceHandlerSupport:文件:spring.handlers.sprin