Spring IOC源码流程
2021-10-13 10:21:18 9 举报
Spring IOC源码流程
作者其他创作
大纲/内容
doCreateBean
获取Class对象
new ArrayList<>(this.beanDefinitionNames)
通过反射创建对象
invokeBeanFactoryPostProcessors
实际干活的方法
applyPropertyValues
false,创建bean
执行完这一步之后,beanDefinition已加载完成,beanDefinitionMap和beanDefinitionNames中都已经有了值
实例化bean
applyBeanPostProcessorsAfterInitialization
准备工作,给一些属性赋值,如启动时间等
调用无参构造函数
initializeBean
clazz.getDeclaredConstructor()ctor.newInstance
initApplicationEventMulticaster
true
initMessageSource
处理BeanPostProcessor
createBean
准备监听器
加载配置文件,解析bean定义信息,包装成beanDefinition
上一步只是对beanDifinition的信息进行填充,还有很多属性是默认值,这一步是填充这些值,设置 BeanFactory 的类加载器,添加几个 BeanPostProcessor,手动注册几个特殊的 bean
广播事件,ApplicationContext 初始化完成
执行BeanFactoryPostProcessor
销毁bean
postProcessBeanFactory
populateBean
registerListeners
postProcessBeforeInstantiation
getBean
refreshBeanFactory
afterPropertiesSet
postProcessBeforeInitialization
属性填充,给实例化好的属性赋值
createBeanInstance
空实现,模板方法
getObjectForBeanInstance
getSingleton
创建BeanFactory容器
beanFactory的准备工作,对各种属性进行填充
loadBeanDefinitions
此时就实例化完了,我们的bean对象,但是里面的属性还都是默认值,接下来就是初始化操作,给属性赋值
这里需要知道 BeanFactoryPostProcessor 这个知识点,Bean 如果实现了此接口,那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法这里是提供给子类的扩展点,到这里的时候,所有的 Bean 都加载、注册完成了,但是都还没有初始化具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类或做点什么事
this.beanDefinitionNames 保存了所有的 beanNames
创建beanFactory容器,此时都是默认值
prepareBeanFactory
registerDisposableBeanIfNecessary
初始化后执行
遍历beanNames,调用getBean方法
registerBeanPostProcessors
设置bean实例的属性
applyBeanPostProcessorsBeforeInstantiation
onRefresh
finishRefresh
当获取到beanName之后,会直接创建吗?先从容器中获取,如果获取不到再创建
resolveBeforeInstantiation
处理InitializeingBean
初始化bean
postProcessAfterInstantiation
isInitializingBean
初始化所有的非懒加载的单例bean
实例化剩下的单例bean
国际化处理
获取实例化策略并且进行实例化操作
obtainFreshBeanFactory
applyBeanPostProcessorsBeforeInitialization
prepareRefresh
createBeanFactory
getInstantiationStrategy().instantiate
实例化后,Instantiation
实例化前,Instantiation
初始化前执行
Aware接口处理器
invokeAwareMethods
准备广播器
invokeInitMethods
finishBeanFactoryInitialization
refresh
doGetBean
注册beanPostProcessor处理器,这里只是注册功能,真正调用的是getBean方法;
Spring IOC
postProcessAfterInitialization
应用实例化前的前置处理器
preInstantiateSingletons
初始化方法
模板方法留给子类来初始化其他的bean
0 条评论
下一页