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);
|