Spring底层源码解析

本文详细解析了Spring的创建生命周期,包括BeanDefinitionReader解析XML配置,BeanFactory利用反射实例化,BeanFactoryPostProcessor与BeanPostProcessor的增强功能,以及Before和After初始化方法。深入探讨了Spring如何处理循环依赖,通过三级缓存机制解决这一问题。同时介绍了Spring流程中的十三个关键方法,并提供了手写简易版Spring的核心代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring流程图

 

 上面这个图呢是我自己画出来的总结图:(可以看下面我写的spring简易版代码就懂了)

        我们可以知道当你使用spring的时候需要些一些配置类啊什么的那么我们是怎么去拿到的呢,

  • 首先我们有一个BeanDefinitionRead去解析你的xml配置文件然后读成BeanDefintion也可以理解为Bean的定义信息,那么拿到定义信息的时候呢我们下一步就是去实例化了,但是注意了这里并不是正在去走实例化,在走实例化的过程中我们需要一个工厂也就是BeanFactory然后工厂利用反射拿到信息,在这之前呢我们BeanFactoryPostProcessor一个增强器图上面我也写了笔记说是获取信息的时候发现需要人为修改一些信息的时候,我们就可以在这里操作了然后再通过工厂去实例化,
  • 在实例化的过程中我们还有一个BeanPostProcessor增强器也是可以做一些操作的接下来就是真正的实例化了,
  • 在实例化过后我们就是初始化但是在初始化前后呢也有两个方法一个Before一个After但是区别是Before是在初始化之前执行After是在初始化之后执行这里不要搞混了
  • 完成初始化之后就是真正的Bean了

Spring创建生命周期流程图

package com.project.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class A {

    @Autowired
    private B b;
    
    public void say(){
        b.sayHello();
    }
}
package com.project.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class B {

   @Autowired
    private A a;

   public void sayHello(){
       a.say();
   }
}

首先这里重点我要讲的是循环依赖:

循环依赖是什么呢,就是当a在创建bean的时候注入了b,而且在a中调用了b,然后我们依赖就会提前创建b属性,但是在c中呢也调用了a,就导致a还没有创建完就调用b,然后再创建b中又去调用了a从此生成循环依赖:那么底层解决方法是什么呢,其实图上面也说了,那我就在详细的说明一下:

  1. 当类通过构造方法的时候他会生成一个普通对象并且会放入到三级缓存中,但只是生成一个lambde不会执行只是生成
  2. 在普通对象发现有依赖注入那么首先会去创建需要依赖注入的对象
  3. 如果是正常的情况下我们会先去单例池中找
  4. 如果没有找到那么就正常的CreateBean创建Bean然后再放入单例池
  5. 如果出现循环依赖,在循环依赖的情况下我们在创建依赖对象的时候发现CreateSet就说明是循环依赖了那么我们底层会先去放入到二级缓存中(earlySingletonObjects--->是一个Map),但是在放入二级缓存中呢我们会去查找二级缓存有没有这个对象在二级缓存如果没有的话我们就去查找三级缓存(singletonFactories),这个时候会执行一开始的lambde对象如果找到了那就返回但是这里要考虑到一个情况如果你是开起来aop那么在这里他会生成代理对象放入到二级缓存,如果没有开启aop的话就不会生成代理对象而是生成普通对象放入到二级缓存中,然后二级缓存在把对象放入到单例池中。

依赖注入<

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱游玩的小零子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值