spring
2022-09-03 21:34:52 7 举报
spring 流程
作者其他创作
大纲/内容
BeanPostProfessor
没有则走默认的实例化逻辑
所有的beanDefinition封装完毕
获取高级容器对象中持有的初级容器,从初级容器中获取BeangetBeanFactory().getBean(name)
while(dependsOn.length = 0)
标记这个bean已经创建完成afterSingletonCreation(beanName);
抛异常
根据beanName获取beanDefinition,并且封装为MergeBeanDefinition(可以通过MergedBeanDefinitionPostProcessor来再创建MergedBeanDefinition后做增强)另一方面可以管理父子BeanDefinition的关系
InstantiationAwareBeanPostProcessor返回一个对象,来代替默认的实例化bean的逻辑Object postProcessBeforeInstantiation()
不允许
BeanUtils.instantiateClass(constructorToUse)
注册spring监听器
false
从父容器获取beanparentBeanFactory.getBean(...)
实例化其他scope的bean
单例缓存获取为空,所以后续得自己实例化Bean
初始化时注册,getBean()时使用
借助BeanDefinitionReader的实现类来解析资源对象XmlBeanDefinitionReader
SmartInstantiationAwareBeanPostProcessor返回构造函数数组,用于选择构造函数实例化beanConstructor<?>[] determineCandidateConstructors()
从aliasMap中以去除\"&\"前缀的name为key,找到对应的value,也就是实际的beanName,如果没有,说明没有注册别名,直接返回beanName
检测循环依赖
xxxApplicationContext.getBean(name)
通过ObjectFactory延时获取BeansingletonFactory.getObject();
mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName)
允许
预先实例化非懒加载到Bean
end
对实现了BeanDefinitionRegisteryPostProfessor接口先排序再执行postProcessBeandDefinitionRegistery()
PropertiesOrderd
mbd.isSingleton
MergedBeanDefinitionPostProcessor此方法在bean生命周期中创建实例化对象后,赋值方法前执行。void postProcessMergedBeanDefinition()
在就拿到缓存单例bean返回
DefaultListableBeanFactory存储了BeanDefinitionMap
初始化事件广播器
存在一个spring高级容器XXXApplicationContext本例子使用ClasspathXmlApplicationContext
isSingletonCurrentlyInCreation = true不存在则去早期缓存中寻找
singletonFactories
对实现了InitializingBean对bean,会在初始化时候执行afterPropertiesSet()
子类 - 父类
从beanDefinition获取依赖属性数组
如果当前BeanFactory存在父容器,且父容器存在beanName对应的BeanDefinition
记录这个bean为单例且正在创建中beforeSingletonCreation(beanName);
单例的
constructorToUse = clazz.getDeclaredConstructor()
DefaultSingletonBeanRegistry存储了Spring的单例对象和多级缓存
最终委托BeanDefinitionDocumentReader来解析xml的node,并且把bean标签转换为spring容器中通用的beanDefinition对象
doXXX()之类的方法再spring中代表存在具体逻辑beanFactory.doGetBean(...)
初始化生命周期处理器,并发出相应的事件进行通知
实例化依赖的bean
AbstractBeanFactory存储了BeanPostProfessors
校验BeanFactory是否初始化完成assertBeanFactoryActive()
非抽象的
首次肯定不在缓存中
earlySingletonObjects
实例化bean对象且包装为beanwrapper
如果传入的name以'&'为前缀,说明我们要获取的不是实际的bean对象,而是产生bean对象的工厂,xxxFactoryBean
true
singletonObjects
InstantiationAwareBeanPostProcessorbean实例化后的后置处理器postProcessPropertyValues()
start
基于classpath下传入spring的xml文件,并封装成Resource对象
非延时加载的
对实现了BeanFactorypostProfessor接口先排序再执行postProcessBeanFactory()
放到disposableBeans里面,bean销毁的时候挨个遍历执行
首次获取,不管是哪个缓存中肯定是不存在的
去除带有\"&\"的前缀
返回bean对象return bean
从definitionMap中找是否存在实现这两个接口的class对象
allowEarlyReference = true不存在则去单例工厂中获取,并放入早期单例缓存,并从单例工厂移除
父类 - 子类
方法参数传入的名称需要转化为实际再beanDefinitionMap中作为key的唯一beanNametransformedBeanName(name)
根据依赖的bean名称获取所依赖的beangetBean(depName)
优先级从上至下递减
DestructionAwareBeanPostProcessorbean销毁前的增强方法postProcessBeforeDestruction()
singletonFactory是一个单例工厂,他本身就是一个接口,其getObject()方法提供了获取bean实例的方法,我们对每个BeanDefinition进行实例化的时候,都是先创建单例工厂的匿名内部类,然后再通过getObject()方法获取对象
从beanDefinitionMap中寻常实现了BeanPostProfessor的接口并注册到beanFactory中
Orderd
未实现排序接口
InstantiationAwareBeanPostProcessorbean实例化后的后置处理器postProcessAfterInstantiation()
CglibSubclassingInstantiationStrategy
先从singletonObjects缓存中获取bean
timing:bean实例化后,属性赋值前
判断是否允许单例早期引用earlySingletonExposure
初始化消息源
高级容器中还包含了初级容器,一般都是实现了BeanDefinitionRegistery和BeanFactory接口xxxBeanFactory
或者虽然该bean并没有实现InitializingBean接口,但某个方法上被init-method方法标注,就会在bean初始化阶段调用
BeanDefinitionRegisteryPostProfessor
在bean实例生成后,属性赋值前span style=\"font-size: inherit;\
下面很关键,解决循环依赖问题
bean创建流程到此结束return bean
ctor.newInstance(argsWithDefaultValues)
BeanFactorypostProfessor
把转换为的beanDefinition注册到初级容器中
放到singletonFactories缓存中去
通过bean后置处理器对bean的属性增强eg:用于注解之类的
收藏
收藏
0 条评论
下一页