Spring IOC容器启动流程图
2023-02-11 22:27:42 0 举报
SpringFramework 6.0源码分析 记录方法调用过程,极大地帮助进行源码流程的梳理
作者其他创作
大纲/内容
大部分实例化和初始化方法都在这里执行
registerListeners();
properties
getObjectForBeanInstance
populate填充属性Bean实例中赋默认值的属性将被填充对应的值
执行init-method
前置处理器BeanPostProcessor::Before
doGetObjectFromFactoryBean
否
singletonFactoriesearlySingletonObjectsregisteredSingletons
DefaultListableBeanFactory
是
增强(改变)Bean定义的信息比如:PlaceholderConfigurerSupport
BeanFactoryPostProcessor
Spring IOC流程中的主体方法refresh为什么取名叫refresh?其中有destory的操作,整体看起来是“刷新”
判断是否是FactoryBeanbeanInstance instanceof FactoryBean
后置处理器BeanPostProcessor::After
initApplicationEventMulticaster();
反射
通过反射而非new来创建对象(实例化)Contructror ctor = clazz.getContractor();obj = ctor.getInstance();
// 获取构造器constructorToUse = clazz.getDeclaredConstructor();
createBeanInstance
context.getBean(\"xxx\")
ClassPathXmlApplicationContext::refresh
object = factory.getObject();return object;
beanInstance
这个地方很重要,但是不理解
invokeBeanFactoryPostProcessors(beanFactory)
BeanDefinitionReader
BeanWrapper bw = new BeanWrapperImpl(beanInstance); initBeanWrapper(bw);return bw;
json
BeanFactory
准备添加各种监听器applicationListeners
各种Set属性 beanFactory.setBeanExpressionResolver(SpEL);beanFactory.addBeanPostProcessor(...)....
populate填充属性
定义规范方便各种类型的文件来进行Bean的定义
font color=\"#323232\
获取构造器说明Spring实例化用的是反射
通过三级缓存,二级缓存,一级缓存来解决循环依赖问题
return object;
registerBeanPostProcessors(beanFactory);
ApplicationContext context = new ClassPathXmlApplicationContext(\"applicationContext.xml\");
// Register bean as disposable.registerDisposableBeanIfNecessary
前置处理
从这个方法的命名就可以看出,要同时满足基本的beanInstance方法,也要满足FactoryBean的getObject功能
return ctor.newInstance(argsWithDefaultValues);
完整对象
obtainFreshBeanFactory()
AbstractBeanFactory::doGetBean
SimpleInstantiationStrategy::instantiate
finishBeanFactoryInitialization(beanFactory);
yaml
在Spring中,以do开头的方法名非常重要
初始化
Bean实例化和初始化要分开理解循环依赖不会在实例化阶段产生,实例化阶段仅仅赋默认值循环依赖有两种情况:1.构造器的循环依赖(无法解决)2.set方法的循环依赖
...
xml
context.getBean(\"BEAN_NAME\")
后置处理
prepareRefresh()
设置Aware
getObjectFromFactoryBean
doCreateBean
ApplicationContext
准备各种资源,以应对接下来的实例化操作
prepareBeanFactory(beanFactory)
beanDefinition
getBean(beanName)
isFactoryBean(beanName)
// 执行实例化BeanUtils.instantiateClass(constructorToUse);
// Instantiate all remaining (non-lazy-init) singletons. beanFactory.preInstantiateSingletons();
return beanInstance;
IOC
AbstractAutowireCapableBeanFactory::createBean
通过Aware的方式来实现填充属性
收藏
0 条评论
回复 删除
下一页