Spring IOC源码分析
2020-09-29 15:35:07 0 举报
AI智能生成
spring IOC源码解析(将会持续更新)
作者其他创作
大纲/内容
作者:Tyus
IOC实现
准备工作
beanFactory容器准备
this.beanFactory = new DefaultListableBeanFactory();
DefaultListableBeanFactory图
bean定义容器:beanDefinitionMap
注册spring内置的PostProcessor
加载资源环境
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
获取bean定义注册器对象:BeanDefinitionRegistry
获取bean工厂对象:ConfigurableListableBeanFactory
获取环境对象:Environment
获取加载资源对象:ResourceLoader
获取类加载器对象:ClassLoader
注册PostProcessor
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
internalConfigurationAnnotationProcessor
ConfigurationClassPostProcessor
ConfigurationClassPostProcessor
ConfigurationClassPostProcessor图
ConfigurationClassPostProcessor#processConfigBeanDefinitions
获取容器中所有的bean定义
循环所有的bean定义,为每个bean定义标记lite还是full
对配置类进行Order排序
调用链很深,没有具体看,以后有空再看
internalAutowiredAnnotationProcessor
AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor图
internalRequiredAnnotationProcessor
RequiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
internalCommonAnnotationProcessor
CommonAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
internalPersistenceAnnotationProcessor
PersistenceAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
internalEventListenerProcessor
EventListenerMethodProcessor
EventListenerMethodProcessor
internalEventListenerFactory
DefaultEventListenerFactory
DefaultEventListenerFactory
注册扫描器
this.scanner = new ClassPathBeanDefinitionScanner(this);
registerDefaultFilters()
注册配置类
register(Class<?>... annotatedClasses)
AbstractApplicationContext#refresh
prepareRefresh
obtainFreshBeanFactory
prepareBeanFactory
设置类加载器,准的SPEL表达式解析器,属性资源编辑器,后置处理器等
设置Aware
注册解析器解析内容
注册了一个事件监听器探测器后置处理器接口
处理aspectj的
注册了bean工厂的内部的bean
postProcessBeanFactory
invokeBeanFactoryPostProcessors
执行流程以及执行内容
AbstractApplicationContext#getBeanFactoryPostProcessors
第一次执行PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
第二次执行PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
第三次执行PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
调用两次PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors
获取容器中所有的实现了BeanFactoryPostProcessor的类
第一次调用实现PriorityOrdered接口的BeanFactoryPostProcessor
第二次调用实现Ordered接口的BeanFactoryPostProcessor
第三次调用没有实现优先级接口的BeanFactoryPostProcessor
registerBeanPostProcessors
去容器中获取所有的BeanPostProcessor 的名称
设定PostProcessor的数量
将beanProcessor分成四种
注册ApplicationListenerDetector 应用监听器探测器的后置处理器
initMessageSource
initApplicationEventMulticaster
容器中存在applicationEventMulticaster
将容器中的对象赋值给applicationEventMulticaster
容器中不存在applicationEventMulticaster
new一个SimpleApplicationEventMulticaster放入容器中
onRefresh
registerListeners
获取容器中所有的监听器对象
获取bean定义中的监听器对象
finishBeanFactoryInitialization
实例化剩余的单例bean
处理实现了LoadTimeWeaverAware接口
冻结所有的bean定义
beanFactory.preInstantiateSingletons();
循环所有的beanDefinitionNames,实例化非抽象,单例且非懒加载的bean
实例化工厂bean
实例化普通bean
bean的实例话过程如下:
String beanName = transformedBeanName(name);
BeanFactoryUtils#transformedBeanName
SimpleAliasRegistry#canonicalName
Object sharedInstance = getSingleton(beanName);
从缓存中获取的sharedInstance不为空时
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
如果是普通bean,直接返回当前实例
如果是工厂bean,需要调用工厂方法生成bean
从缓存中获取的sharedInstance为空时
从父容器中获取bean
将GenericBeanDefinition转为RootBeanDefinition
处理dependsOn的依赖
第一个分支:处理单例的bean
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
第一个后置处理器:InstantiationAwareBeanPostProcessor
开始创建bean:AbstractAutowireCapableBeanFactory#doCreateBean
创建bean实例化:instanceWrapper = createBeanInstance(beanName, mbd, args);
从bean定义中解析出当前bean的class对象
通过无参或者有参构造函数进行创建对象
第二个后置处理器:SmartInstantiationAwareBeanPostProcessor
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
第三个后置处理器:MergedBeanDefinitionPostProcessor
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
第四个后置处理器:SmartInstantiationAwareBeanPostProcessor
populateBean(beanName, mbd, instanceWrapper);
第五个后置处理器:InstantiationAwareBeanPostProcessor
完成各种属性的注入
第六个后置处理器:InstantiationAwareBeanPostProcessor
exposedObject = initializeBean(beanName, exposedObject, mbd);
处理bean是实现了Aware接口
若实现了BeanNameAware接口,调用setBeanName方法
若实现了BeanClassLoaderAware接口,调用setBeanClassLoader方法
若实现了BeanFactoryAware接口,调用setBeanFactory方法
第七个后置处理器:BeanPostProcessor
invokeInitMethods(beanName, wrappedBean, mbd);
第八个后置处理器:BeanPostProcessor
若创建异常销毁bean:destroySingleton(beanName);
第二个分支:处理多例的bean
第三个分支:处理自定义生命周期的bean
循环所有的beanDefinitionNames,调用实现了SmartInitializingSingleton接口
finishRefresh
AOP实现
事务实现
0 条评论
下一页