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