![](https://img-blog.csdnimg.cn/20200313081736247.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
spring IOC源码
文章平均质量分 79
spring Ioc源码解析
bugpool
根本没有什么架构师,或者说只要用心,人人都是架构师。
展开
-
老实人spring源码解析目录
本篇介绍一下通过本专题将学习哪些内容以及一些前期的准备工作。#前言1.本专题主要以XmlBeanFactory展开源码阅读,主要介绍spring IoC容器的启动(Bean的解析)及Bean实例化两大阶段。 可能现在基本上不会有人再开发中再使用XmlBeanFactory,但是XmlBeanFactory较为简单,可以刨去一些增强功能,有助于抓住spring主线的理解。2.在阅读源码前,有...原创 2020-03-14 10:24:08 · 2778 阅读 · 3 评论 -
spring源码01: spring源码编译 环境搭建
下文介绍spring源码在idea环境下的搭建,目的是为了更好的阅读和调试代码,已搭建完的小火伴可跳过本节,直接开启被锤之路…#备选方案为什么把备选方案写在前面呢,因为单纯的看源码调试,直接用IDEA新建Spring项目后就可以进行调试,并且IDEA还会贴心的在右上方提示Download sources,阅读调试源码是基本上没有问题的,作者自己也经常这么干。但是毕竟这种游击队做法的java文件...原创 2020-03-14 10:24:26 · 1745 阅读 · 0 评论 -
spring源码02: spring IoC启动原理
#Spring运行原理简述使用spring IoC主要分为两个阶段。在上一篇中看到的代码实际只有2行,这两行对应着不同的2个阶段,麻雀谁小五胀俱全,这短短2行代码spring却为我们做了大量的工作。简单概述,spring在第一阶段将XML等配置文件读入到spring容器内生成一个个beanDfinition,该步骤就好比设计师根据用户的需求(也就是xml上的配置)绘制设计图纸的步骤,而生成的be...原创 2020-03-14 10:29:19 · 5282 阅读 · 0 评论 -
spring源码03: 资源文件读取
接下去将顺着流程图中6大转化过程,跟踪代码,逐一讲解#Xml文件 -> ResourcexmlBeanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));创建ClassPathResource对象// ClassPathResource.java public ClassPathR...原创 2020-03-14 10:41:04 · 924 阅读 · 0 评论 -
spring源码04: XML中获取DOM树
上节讲到 xml文件 -> Resource -> InputStram,并且提到spring的一个有趣的规则,即以do开头的均为真正的核心逻辑。本节继续跟踪XmlBeanDefinitionReader.java中的doLoadBeanDefinitions。即流程图的第3点,inputStream -> DOM树#inputStream -> DOMXml文件...原创 2020-03-14 10:44:22 · 810 阅读 · 0 评论 -
spring源码05: DOM树默认名称空间解析
// XmlBeanDefinitionReader.javaprotected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { // 1.将文件流转化为DOM树 Document doc = ...原创 2020-03-14 10:48:51 · 912 阅读 · 0 评论 -
spring源码06: bean标签 解析注册
先回顾一下上一节讲到默认名称空间的解析,默认标签分为4中:import、alias、bean、beans本节将对bean标签的解析、修饰、注册进行讲解当前阶段对应是流程图的 DOM树 -> beanDefinition -> beanDefinitionHolder -> register// DefaultBeanDefinitionDocumentReader.java...原创 2020-03-14 10:57:37 · 829 阅读 · 0 评论 -
spring源码07: import标签解析
本节介绍一下import标签的解析,import标签用于引进新的资源文件,例如一个spring.xml需要引入redis,jdbc等配置文件。主要是要像读者介绍一下递归加载的思想,包括beans标签也使用到了递归的思想,不过beans是递归加载bean,而import是递归加载资源文件。<beans> <import resource="redis.xml"> &...原创 2020-03-14 10:59:27 · 782 阅读 · 0 评论 -
spring源码08: 第二阶段前言
前言MyBean myTestBean = (MyBean) bf.getBean("myBean");经历了第一阶段,Xml相关配置文件已经转换成了XmlBeanFactory的内部表示。通过getBean(“myBean”),Spring将在Map中查询出key="myBean"的BeanDefinition。再通过获取BeanDefinition的class,构造函数等信息,对Bean...原创 2020-03-14 11:02:07 · 686 阅读 · 0 评论 -
spring源码09: getBean
MyBean myTestBean = (MyBean) bf.getBean("myBean");@Overridepublic <T> T getBean(String name, Class<T> requiredType) throws BeansException { return doGetBean(name, requiredType, null, f...原创 2020-03-14 11:12:08 · 1056 阅读 · 0 评论 -
spring源码10: spring从缓存中获取bean
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { /** * 1. 转换beanN...原创 2020-03-14 11:15:20 · 3864 阅读 · 0 评论 -
spring源码11: spring获取单例
// AbstractBeanFactory.java// 7. 单例情况下if (mbd.isSingleton()) { /** * 核心代码,spring4.x中是这么写的,会更容易理解一点 * sharedInstance = getSingleton(beanName, new ObjectFactory<object>() { * getObject(...原创 2020-03-14 11:19:12 · 964 阅读 · 0 评论 -
spring源码12: spring创建Bean
创建bean前准备如果使用调试模式,跟进来下面代码倒不会有什么疑问,但是这一步代码的跳转确十分奇特。在上一节讲到,首先spring在AbstractBeanFactory类中创建了ObjectFactory的对象,并重写了getObject()方法,然后将他传给DefaultSingletonBeanRegistry。此时DefaultSingletonBeanRegistry调用了singl...原创 2020-03-14 11:32:35 · 1760 阅读 · 0 评论 -
灵魂画手图解Spring循环依赖
想彻底弄清楚spring的循环依赖问题,首先得弄清楚1. 循环依赖是如何发生的,spring又是如何检测循环依赖的发生的。其次才是2. 探究spring如何解决循环依赖的问题1. 循环依赖检查<bean id="a" class="A"> <property name="b" ref="b"><bean/><bean id="b" class="...原创 2020-03-14 11:48:08 · 11448 阅读 · 19 评论 -
spring BeanPostProcessor 生命周期
BeanPostProcessor:后置处理器spring使用模板模式,在bean的创建过程中安插了许多锚点,用户寻找对应的锚点,通过重写方法介入到bean的创建过程当中。本节通过重写这些锚点,学习如何使用BeanPostProcessor、获取各类BeanAware并且理清bean的生命周期代码控制台// 控制台的输出结果1. postProcessBeforeInstantiatio...原创 2020-03-16 23:42:06 · 5533 阅读 · 0 评论 -
spring源码14: 实例化 无参构造器
所有Bean创建的真正逻辑都在doCreateBean函数中,本篇把重点放在第一点实例化bean上,先省略其他无关代码。bean的实例化实质就是调用构造函数的过程。构造函数分为有参数的构造函数和无参数的构造函数,对比起无参数构造函数,有参数构造函数将大量的工作花在了挑选最合适的构造函数的过程中,并非是核心所在,因此本篇只讲无参数的构造函数// AbstractAutowireCapableBe...原创 2020-03-14 13:32:23 · 1058 阅读 · 0 评论 -
spring源码15: 属性填充
#spring属性注入分4种:不开启自动注入,即xml自己配置property通过名称自动注入通过类型自动注入@Autowire自动注入本篇我们将介绍前三种,@Autowire应该是百分之99的开发者选择的的注入方式,它通过属性填充中的后置处理器完成,因此本篇有涉及后置处理器的不用太纠结,将单独一片详解:spring源码日期16: @Autowired实现原理下方代码,本篇只关心...原创 2020-03-14 13:34:46 · 1096 阅读 · 0 评论 -
spring源码16: @Autowired实现原理
在阅读本篇之前,如果对后置处理器还不够熟悉的先参考下spring BeanPostProcessor 生命周期@Autowired使用构造函数注入public Class Outer { private Inner inner; @Autowired public Outer(Inner inner) { this.inner = inner; }}属性注入pub...原创 2020-03-14 13:42:11 · 3565 阅读 · 0 评论 -
spring源码17: 初始化
在此篇文章开始之前,如果读者对BeanAware、BeanPostProcessors还不够熟悉熟悉,强烈建议先阅读一下这篇文章:spring BeanPostProcessor 生命周期protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object...原创 2020-03-14 13:45:27 · 1004 阅读 · 0 评论 -
Spring源码最难问题《当Spring AOP遇上循环依赖》
4.AOP中的循环依赖在看自动代理源码的过程中,突然注意到SmartInstantiationAwareBeanPostProcessor接口中的getEarlyBeanReference方法,它是Spring处理循环依赖时返回**未创建完(只实例化未做依赖注入)**Bean的扩展。关于循环依赖可以去Bean的循环依赖一章去详细了解,这里只做简单的说明。有两个单例Bean,A和B,A中引用了B...原创 2020-04-03 21:35:26 · 13849 阅读 · 53 评论