Spring注解驱动开发学习总结21:Spring容器创建 - 创建bean的详细步骤
回顾前3篇文章:
1、Spring注解驱动开发学习总结18:Spring容器创建 - beanFactory创建和预准备工作步骤
分析了Spring容器refresh方法的:
1)刷新前的容器准备:prepareRefresh();
2)刷新内置的bean工厂:obtainFreshBeanFactory();
3)bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4)bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
2、Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤
分析了Spring容器refresh方法的:
5)执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)
3、Spring注解驱动开发学习总结20:Spring容器创建 - 注册bean后置处理器、初始化事件派发器、注册监听器
分析了Spring容器refresh方法的:
6)注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7)初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8)初始化事件派发器:initApplicationEventMulticaster();
9)容器刷新方法:onRefresh();
10)注册监听器:registerListeners();
本文接着分析refresh方法
11、创建剩下的单实例bean:finishBeanFactoryInitialization(beanFactory)
12、完成刷新方法:finishRefresh()
1、分析11步中的finishBeanFactoryInitialization方法
在867行,会先调用beanFactory.preInstantiateSingletons()方法来创建剩下的非懒加载的bean实例
分析preInstantiateSingletons方法
11.1 在735行,先获取容器中所有定义的bean名称
11.2 在729-741行,先获取bean的定义信息:RootBeanDefinition。如果该bean不是抽象的,是单
实例的,不是懒加载的话,再判断是否是FactoryBean。
如果是FactoryBean,在742行:factory = getBean(FACTORY_BEAN_PREFIX + beanName);
如果不是FactoryBean,在761行:getBean(beanName)
接下来分析如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
11.3 在781行,在bean创建完成后,依次判断bean是否实现了SmartInitializingSingleton接口,如果
是,就执行它的afterSingletonsInstantiated方法
分析11.2中的doGetBean方法
11.2 如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
分析doGetBean方法
11.2.1 在243-244行,先尝试从缓存中获取bean:getSingleton(beanName)。
在getSingleton方法的185行,会从singletonObjects中获取该bean。
在DefaultSingletonBeanRegistry类的86行,可以得到singletonObjects的定义:
Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>
(256);
如果从缓存中获取不到,那么只能自己创建了
11.2.2 在288-296行,先获取当前bean所依赖的bean的信息,如果有的话,需要先把依赖的
bean给创建出来:getBean(dep);
11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
上面4张图是11.2.1中关联的图。
上面1张图是11.2.2和11,2,3中关联的图。
分析11.2.3中的createBean方法
11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
分析createBean方法
11.2.3.1 在472-473行,给后置处理器一个机会来返回该bean的代理对象:
resolveBeforeInstantiation。
分析resolveBeforeInstantiation方法,在1011-1014行,
先调用后置处理器的beanPostProcessorsBeforeInstantiation方法,
如果有返回值,再调用后置处理器的beanPostProcessorsAfterInitialization方法
11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
分析11.2.3.2中的doCreateBean方法
11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
11.2.3.2.1 在513行,调用createBeanInstance方法,利用工厂方法或者对象的构造器通过反射
创建出bean实例。
11.2.3.2.2 在523行,调用applyMergedBeanDefinitionPostProcessors方法。
在该方法的990-993行中,会执行所有后置处理器为
MergedBeanDefinitionPostProcessor类型的postProcessMergedBeanDefinition方法
11.2.3.2.3 在553行,调用populateBean方法给bean属性赋值,接着分析populateBean方法
1)在1223-1228行,执行所有类型为InstantiationAwareBeanPostProcessor的后置处
理器的postProcessAfterInstantiation方法
2)在1261-1266行,执行所有类型为InstantiationAwareBeanPostProcessor的后置处
理器的postProcessPropertyValues方法
3)在1276行,为bean属性利用setter方法进行赋值:applyPropertyValues
11.2.3.2.4 在555行,调用initializeBean方法初始化bean,接着分析initializeBean方法
1)在1615行,执行Aware接口的回调方法:invokeAwareMethods
回调的接口类型有:BeanNameAware、BeanClassLoaderAware、
BeanFactoryAware
2)在1620行,执行初始化之前的后置处理器操作:
applyBeanPostProcessorsBeforeInitialization
遍历所有后置处理器beanProcessor,执行以下操作
beanProcessor.postProcessBeforeInitialization(result, beanName);
3)在1624行,执行初始化方法:invokeInitMethods
在该方法中调用初始化方法
4)在1633行,执行初始化之后的后置处理器操作:
applyBeanPostProcessorsAfterInitialization
遍历所有后置处理器beanProcessor,执行以下操作
beanProcessor.postProcessAfterInitialization(result, beanName);
11.2.3.2.5 在597行,注册bean的销毁方法:registerDisposableBeanIfNecessary
上面2张图是与11.2.3.2.1-11.2.3.2.2相关的图
上面3张图是与11.2.3.2.3相关的图
上面5张图是与11.2.3.2.4相关的图
上面1张图是与11.2.3.2.5相关的图
2、分析12步中的finishBeanFactoryInitialization方法
12、完成刷新方法:finishRefresh()
12.1 在877行,初始化生命周期相关的处理器:initLifecycleProcessor
分析initLifecycleProcessor方法
在772-774,780-783行,判断beanFactory中是否有id为lifecycleProcessor类型为
LifecycleProcessor的处理器。如果没有的话:
则创建一个默认的处理器并加入到容器中:new DefaultLifecycleProcessor
12.1 在880行,拿前面定义的生命周期处理器回调onRefresh方法:
getLifecycleProcessor().onRefresh()
12.1 在883行,发布容器刷新完成的事件:publishEvent(new ContextRefreshedEvent(this))
12.1 在886行,:LiveBeansView.registerApplicationContext(this);
3、小结
前面3篇文章分析了refresh方法1-10的步骤,本文分析了refresh方法中的第11-12步。
尤其是重点分析了11步中的创建bean的基本流程步骤,里面部分和之前AOP原理分析的代码是一致的,并且是想贯通的。但是本文没有具体分析循环导入、依赖导入的详细分析,只是大致列出了基本的bean实例的大致步骤。
1、刷新前的容器准备:prepareRefresh();
2、刷新内置的bean工厂:obtainFreshBeanFactory();
3、bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4、bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
5、执行beanFactory的后置处理器工作:
invokeBeanFactoryPostProcessors(beanFactory)
6、注册bean后置处理器:registerBeanPostProcessors(beanFactory)
7、初始化MessageSource组件(国际化功能、消息绑定):initMessageSource();
8、初始化事件派发器:initApplicationEventMulticaster();
9、容器刷新方法:onRefresh();
10、注册监听器:registerListeners();
11、创建剩下的单实例bean:finishBeanFactoryInitialization(beanFactory)
在867行,会先调用beanFactory.preInstantiateSingletons()方法来创建剩下的非懒加载的bean
实例。接下来继续分析preInstantiateSingletons方法
11.1 在735行,先获取容器中所有定义的bean名称
11.2 在729-741行,先获取bean的定义信息:RootBeanDefinition。如果该bean不是抽象的,
是单实例的,不是懒加载的话,再判断是否是FactoryBean。
如果是FactoryBean,在742行:
factory = getBean(FACTORY_BEAN_PREFIX + beanName);
如果不是FactoryBean,在761行:getBean(beanName)
接下来分析如果不是FactoryBean的情况:getBean方法先调用doGetBean(name)方法
11.2.1 在243-244行,先尝试从缓存中获取bean:getSingleton(beanName)。
在getSingleton方法的185行,会从singletonObjects中获取该bean。
在DefaultSingletonBeanRegistry类的86行,可以得到singletonObjects的定义:
Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>
(256);
如果从缓存中获取不到,那么只能自己创建了
11.2.2 在288-296行,先获取当前bean所依赖的bean的信息,如果有的话,需要先把依赖
的bean给创建出来:getBean(dep);
11.2.3 在302,306行,创建单实例bean:createBean(beanName, mbd, args);
11.2.3.1 在472-473行,给后置处理器一个机会来返回该bean的代理对象:
resolveBeforeInstantiation。
分析resolveBeforeInstantiation方法,在1011-1014行,
先调用后置处理器的beanPostProcessorsBeforeInstantiation方法,
如果有返回值,再调用后置处理器的beanPostProcessorsAfterInitialization方法
11.2.3.2 如果上一步没有返回代理对象,在483行,调用doCreateBean方法创建bean
11.2.3.2.1 在513行,调用createBeanInstance方法,利用工厂方法或者对象的
构造器通过反射创建出bean实例。
11.2.3.2.2 在523行,调用applyMergedBeanDefinitionPostProcessors方法。
在该方法的990-993行中,会执行所有后置处理器为
MergedBeanDefinitionPostProcessor类型的
postProcessMergedBeanDefinition方法
11.2.3.2.3 在553行,调用populateBean方法给bean属性赋值,接着分析
populateBean方法
1)在1223-1228行,执行所有类型为
InstantiationAwareBeanPostProcessor的后置处
理器的postProcessAfterInstantiation方法
2)在1261-1266行,执行所有类型为
InstantiationAwareBeanPostProcessor的后置处
理器的postProcessPropertyValues方法
3)在1276行,为bean属性利用setter方法进行赋值:
applyPropertyValues
11.2.3.2.4 在555行,调用initializeBean方法初始化bean,接着分析initializeBean
方法
1)在1615行,执行Aware接口的回调方法:invokeAwareMethods
回调的接口类型有:BeanNameAware、BeanClassLoaderAware、
BeanFactoryAware
2)在1620行,执行初始化之前的后置处理器操作:
applyBeanPostProcessorsBeforeInitialization
遍历所有后置处理器beanProcessor,执行以下操作
beanProcessor.postProcessBeforeInitialization(result, beanName);
3)在1624行,执行初始化方法:invokeInitMethods
在该方法中调用初始化方法
4)在1633行,执行初始化之后的后置处理器操作:
applyBeanPostProcessorsAfterInitialization
遍历所有后置处理器beanProcessor,执行以下操作
beanProcessor.postProcessAfterInitialization(result, beanName);
11.2.3.2.5 在597行,注册bean的销毁方法:registerDisposableBeanIfNecessary
11.3 在781行,在bean创建完成后,依次判断bean是否实现了SmartInitializingSingleton接口,
如果是,就执行它的afterSingletonsInstantiated方法
12、完成刷新方法:finishRefresh()
12.1 在877行,初始化生命周期相关的处理器:initLifecycleProcessor
分析initLifecycleProcessor方法
在772-774,780-783行,判断beanFactory中是否有id为lifecycleProcessor类型为
LifecycleProcessor的处理器。如果没有的话:
则创建一个默认的处理器并加入到容器中:new DefaultLifecycleProcessor
12.1 在880行,拿前面定义的生命周期处理器回调onRefresh方法:
getLifecycleProcessor().onRefresh()
12.1 在883行,发布容器刷新完成的事件:publishEvent(new ContextRefreshedEvent(this))
12.1 在886行,:LiveBeansView.registerApplicationContext(this);