1.spring容器的refresh();方法
1.1 prepareRefresh();刷新前预处理
1.1.1)initPropertySources();初始化一些属性设置(子类自定义个性化属性方法)
1.1.2)getEnvironment().validateRequiredProperties();检验属性的合法
1.1.3)this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的早期事件
1.2 obtainFreshBeanFactory();获取BeanFactory
1.2.1)refreshBeanFactory();刷新【设置序列号id】BeanFactory
1.2.1.1)创建一个DefaultListableBeanFactory beanFactory = createBeanFactory();
1.2.2)getBeanFactory();返回BeanFactory【DefaultListableBeanFactory】
1.3 prepareBeanFactory(beanFactory);BeanFactory的预处理工作(初始化值)
1.3.1 设置类加载器等。。。
1.3.2 添加BeanPostProcessor【ApplicationContextAwareProcessor】
1.3.3 设置自动装配的接口,忽略自动装配的接口
1.3.4 添加BeanPostProcessor【ApplicationListenerDetector】
1.3.5 给BeanFactory中注册一些能用的组件environment,systemProperties,systemEnvironment
1.4 postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行后置处理(子类通过重写这个方法实现)
==========================以上是BeanFactory的创建和准备====================
1.invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactory的后置处理器
BeanFactoryPostProcessors:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行的
1.1 获取所有BeanDefinitionRegistryPostProcessors
1.2 根据优先级分组,顺序执行postProcessor.postProcessBeanDefinitionRegistry(registry);
1.3 再执行BeanFactoryPostProcessors
2.registerBeanPostProcessors(beanFactory);注册bean的后置处理器
2.1 根据优先级注册所有BeanPostProcessor
3.initMessageSource();国际化,消息绑定,解析
3.1 获取BeanFactory
3.2 看容器是否有id为messageSource的组件(有就取,没就创建DelegatingMessageSource)注册到容器中
4.initApplicationEventMulticaster();初始化事件派发器
5.onRefresh();(留给子类重写)
6.registerListeners();注册项目所有ApplicationListener
6.1 注册项目所有ApplicationListener
6.2 将监听器添加到事件派发器
6.3 派发之前步骤产生的事件
7.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean
7.1 启动单实例Bean创建流程
7.1.2 createBean(beanName,mbd,args);
7.1.3 如果bean实现了InstantiationAwareBeanPostProcessors,执行postProcessBeforeInstantiation和postProcessAfterInstantiation方法返回代理对象
7.1.4 如果没有代理对象返回,调用7.1.5
7.1.5 创建bean
doCreateBean(beanName, mbdToUse, args);
1)创建bean实例instantiateUsingFactoryMethod(beanName, mbd, args);利用工厂方法或对象构造器创建bean实例
2)applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法
3)执行spring bean的生命周期文章上的第4点(bean初始化赋值,执行bean的后置处理器)
=========================================================
1.finishRefresh();完成BeanFactroy初始化创建,ioc容器创建完成
1.1 initLifecycleProcessor();初始化和生命周期有关的后置处理器:LifecycleProcessor
自定义一个LifecycleProcessor的实现类
1.2 拿到生命周期处理器(BeanFactory)回调getLifecycleProcessor().onRefresh();
1.3 publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
1.4 LiveBeansView.registerApplicationContext(this);
================总结================
1)spring容器启动的时候,会先保存所有注册进来的Bean定义信息
1.1)xml注册bean
1.2)注解注册Bean @Service等
2)spring容器会合适事件创建Bean
1.1)用这个bean时,利用getBean创建bean,创建好后保存到容器中
1.2)统一创建剩下所有bean时,finishBeanFactoryInitialization();
3)后置处理器BeanPostProcessor
3.1)每个bean创建完成,会使用各种后置处理器进行处理,增强bean的功能
4)事件驱动模型
ApplicationListener:事件监听
ApplicationEventMulticaster:事件派发(多播器)