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