Spring容器refresh(); 【容器刷新】
1、prepareRefresh(); 清理缓存,记录状态
(1)initPropertySources(); 初始化属性设置,交给子类自定义属性设置方法。
(2)属性的校验
(3)保存容器早期的事件(为事件派发器做基础)
2、obtainFreshBeanFactory(); 获取bean工厂
(1)refreshBeanFactory(); 刷新并创建beanFactory,设置id
(2)getBeanFactory(); 返回刚创建的BeanFactory
(3)返回【DefaultListableBeanFactory】;
3、prepareBeanFactory(beanFactory); 设置属性
(1)设置类加载器、表达式解析器等
(2)添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
(3)忽略自动装配的接口
(4)注册可以解析的自动装配。ioc容器、事件派发器、资源加载器、beanFactory
(5)添加BeanPostProcessor[在Bean初始化前后做一些工作]
(6)给BeanFactory添加有用的组件;系统、环境的参数设置
4、postProcessBeanFactory(beanFactory); BeanFactory准备工作完成后进行后置处理工作。
(1)postProcessBeanFactory(beanFactory);准备工作完成后的后置处理工作;
BeanFactory创建和预准备工作====
5、invokeBeanFactoryPostProcessors(beanFactory); 执行BeanFactoryPostProcessor
BeanFactoryPostProcessor:BeanFactory的后置处理器,在BeanFactory标准初始化之后执行
两个接口:BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
1.1)、执行BeanFactoryPostProcessor方法:
先执行BeanDefinitionRegistryPostProcessor
1.2)、再执行实现了PriorityOrdered优先级接口的BeanPostProcessor
1.3)、再执行实现了Ordered顺序接口的Bean----PostProcessor
1.4)、最后执行没有实现任何优先级的BeanDefinitionRegistryPostProcessor
2.1再执行BeanFactoryPostProcessor的方法
2.2)、再执行实现了PriorityOrdered优先级接口的BeanPostProcessor
2.3)、再执行实现了Ordered顺序接口的Bean----PostProcessor
2.4)、最后执行没有实现任何优先级的BeanDefinitionRegistryPostProcessor
6、registerBeanPostProcessors(beanFactory); 注册Bean的后置处理器
拦截Bean创建过程
BeanPostProcessor、
DestructionAwareBeanPostProcessor等
(1)获取所有的BeanPostProcessor,后置处理器都可以通过PriorityOrdered、Ordered接口执行优先级
(2)先注册优先级的BeanPostProcessor,将每一个BeanPostProcessor,添加到BeanFactory中
(3)再注册Order的接口、再注册未实现优先级的接口
(4)最终注册MergedBeanDefinitionPostProcessor
(5)注册一个ApplicationListenerDetector:在Bean创建完成后检查如果是ApplicationListener如果是
就将其保存起来
7、initMessageSource(); 初始化SpringMVC组件(国际化、消息绑定、消息解析)
(1)获取BeanFactory
(2)查看id是否有MessageSource类型的组件
如果有id为messageSource,则赋值,没有则新建默认的组件 MessageSource从配置文件取国际化值,根据区域信息获取值
(3)将创建好的MessageSource注册在容器中,
8、 initApplicationEventMulticaster(); 初始化事件派发器【事件驱动开发组件】
(1)获取BeanFactory
(2)如果自定义配置,从BeanFactory获取应用事件派发器
(3)如果没配会创建[简单应用事件派发器]并注入到BeanFactory中
9、onRefresh(); 留给子容器(子类)
(1)、子类重写onRefresh方法,在容器刷新的时候可以自定义逻辑
10、registerListeners(); 给容器将所有的监听器ApplicationListener注册进来。
(1)、将每个监听器添加到事件派发器中
(2)、派发以前步骤产生的事件;
11、finishBeanFactoryInitialization(beanFactory); 初始化所有剩下的单实例Bean
(1)获取容器中的所有Bean依次进行初始化和创建,
(2)获取RootBeanDefinition定义信息
(3)Bean不是抽象的、单例的、【不】是懒加载的
(3.1)是否为FactoryBean:是否实现FactoryBean接口:getObject()创建Bean
(3.2)不是FactoryBean,通过getBean()创建对象
0)、getBean() -> doGetBean(beanName)
1)、缓存可以找到:获取单例缓存Bean,【创建的都会被缓存起来】
2)、缓存找不到:创建单实例Bean
3)、标记、获取Bean定义信息,
4)、获取当前Bean依赖的依赖Bean,如果有,通过getBean()创建
5)、createBean()来创建Bean
让BeanPostProcessor【Instantiation】先拦截返回代理对象
若不是代理Bean,则创建Bean
<1>、创建Bean实例createBeanInstance(beanName,mbd,args)
用工厂方法等创建Bean
<2>、执行后置处理器
InstantiationAwareBeanPostProcessor的后置处理器
postProcessAfterInstantiation();
InstantiationAwareBeanPostProcessor后置处理器
postProcessPropertyValues();
<3>、应用Bean属性的值,为属性利用setter方法进行赋值
<4>、【Bean初始化】initializeBean
执行Aware接口方法
执行后置处理器初始化前
执行初始化方法
执行后置处理器初始化后
注册Bean的销毁方法
6)、将创建的Bean添加到缓存中singletonObjects;
ioc容器就是这些Map,保存了很多信息
12、finishRefresh(); 完成BeanFactory的初始化创建工作,ioc容器就创建完成了。
initLifecycleProcessor():初始化和声明周期有关的后置处理器。
写LifecycleProcessor实现类,在BeanFactory中,
void onRefresh()
void onClose()
总结===========
1)、Spring容器在启动的时候,会先保存所有注册的Bean定义信息
1)、xml注册Bean
2)、注解注册Bean @Service、、、、
2)、Spring容器找合适的机会创建Bean
1)、用到Bean的时候,利用getBean创建Bean,创建好后保存在容器中
2)、统一创建剩下的所有Bean中。
3)、后置处理器
1)、每个Bean创建完成后,都会使用各种后置处理器进行增强bean的功能
autowired、async、aspectJ、等、、、、
4)、事件驱动模型
applicationListener:事件监听
事件派发:applicationEventMulticaster