spring源码解读
2022-01-13 20:00:47 18 举报
spring源码解读
作者其他创作
大纲/内容
执行初始化后置处理方法
完成注解功能
invokeInitMethod
getBean
bean的扩展实现:以原始对象为引用,通过AOP机制生成该对象的代理对象,所以,AOP是IOC的一个扩展实现,
FactoryBean
找到了
完成实例化未完成初始化
key:a (删除)value:lambda
A-B
AOP
查找A
没找到
创建A对象
afterPropertiesSet
扩展实现
createBean
本质
初始化B对象。给a属性赋值
查找B
创建对象
doGetBean
[RuntimeBeanReference]@2385'<a>'运行时对象引用applyPropertyValues(){ bw.setPropertyValues(new MutablePropertyValues(deepCopy));}
postProcessBeforeInitialization
反射创建对象步骤:1、获取class对象2、Constructor ctor = clazz.getDeclaredConstructor();3、Object obj = ctor.newInstance();
@Autowired@Value
执行初始化方法调用(init-method)
标准的bean生命周期流程
key:a (删除)value:A@1573(半)
postProcessAfterInitialization
对象实例化和初始化分开操作
invokeAwareMethods
实例化B对象,a=null
存入B
spring如何解决循环依赖问题?
xml
key:bvalue:A@1573(成)
直接给a属性赋值
注解
key:b (删除)value:lambda
实例化:分配内存,属性为默认值
ObjectFactory<?>
匿名内部类或lamba表达为参数传递进方法,当调用到该方法时,实际调用的是匿名内部类或lamba表达
A@1573b =null
createBeanInstance实例化对象
bean的扩展实现
直接给b属性赋值
populateBean初始化对象
如果持有了某个对象的引用,那么能否在后续的步骤中给引用对象赋值可以
是否实现了initializingBean接口
AbstractAutowireCapableBeanFactory
创建B对象
容器属性赋值
BeanPostProcessor
defaultListableBeanFactory
@PostContruct
动态代理
阻断
函数式接口
销毁对象
doCreateBean
AOP是IOC的一个扩展实现
完成实例化且完成初始化
二级缓存
用户自定义属性赋值
key:avalue:B@2171(成)
三级缓存总结1、三个缓存对象,在获取数据的时候,是按照什么顺序来获取的?先获取一级缓存,没有在获取二级缓存,没有再获取三级缓存,所以当前面的缓存中存在了对象那么后面就需要把缓存对象给清空2、如果只有一级缓存,能解决循环依赖问题吗?不能,如果只有一级缓存,那么成品对象和半成品对象会放到一起,这个是没办法区分了,所以需要两个缓存来分别存放不同状态的对象,一级缓存放成品,二级缓存放半成品3、如果只有二个缓存,能否解决循环依赖问题?在刚刚的整个流程中,三级缓存一共出现了几次?getSingleton,doCreateBean如果对象的创建过程中不包含aop,那么二级缓存就可以解决循环依赖问题,但是包含aop的操作,循环依赖问题是解决不了的4、为什么添加了aop的操作之后就需要添加三级缓存来解决这个问题?三级缓存加了什么操作?添加了一个getEarlyBeanReference的方法在创建代理对象的时候,是否需要生成原始对象?需要当创建完成原始对象之后,后续又需要创建代理对象,那么对象在引用的时候应该使用哪一个?换句话说,就是一个beanName对应有两个对象,(原始对象和代理对象)在整个容器中,有且仅能有一个同名的对象,当需要生成代理对象的时候,就要把代理对象覆盖原始对象程序是怎么知道在什么时候要进行代理对象的创建的呢?需要一个类似于回调的接口判断,当第一次对外暴露使用的时候,来判断当前对象是否需要去创建代理对象,getEarly BeanRefenerce方法的if判断,如果需要代理就返回代理对象,如果没有代理就返回原始对象spring是一个框架,跟业务无关,没办法预先感知是否需要代理对象,所以整体的执行流程会把所有可能的情况都考虑进去,因此在存储的时候先要往三级缓存仍一份lambda表达式,等到运行时才知道要不要调用。singletonObject = singletonFactory.getObject(); Exception in thread \"main\
SimpleInstantiationStrategy
BeanFactory
dug过程中会出现套娃现象,要明确每个步骤是干什么的
成品
分配内存,属性默认值
DefaultSingletonBeanRegistry
1、属性赋值2、执行init方法3、扩展实现
Aware一个空接口,起到标识作用
BeanFactoryAwareApplicationContextAwareResouceLoadAwareServletContextAware
createBeanInstance
AbstractApplicationContext13个重要步骤
使用对象
执行初始化方法
对象在创建过程中存在的两种状态
否
三级缓存
三级缓存,或者说提前暴露对象
都是用来创建对象
resolveValueIfNecessary()开始套娃:bean = this.beanFactory.getBean(refName);
PopulateBean
到容器中找B对象
给用户最后一次机会进行赋值或调用操作
实例化
B@2171a =null
存入A
执行初始化前置处理方法
BeanDefinitionValueResolver
标准化的流程
半成品
初始化A对象。给b属性赋值
map:缓存1 A:半成品2 B:半成品3 B:成,引用A半
AbstractBeanFactory
初始化
cglib/jdk
是
循环依赖之三级缓存解决方案
invokeInitMethods
属性赋值
到容器中找A对象
一级缓存
实例化A对象,b=null
私人订制

收藏
0 条评论
下一页