Spring容器创建过程
Spring容器的refresh()【创建刷新】
1. prepareRefresh() 刷新前的预处理
1.1 initPropertySources() 初始化一些属性;子类自定义个性化的属性设置
1.2 getEnvironment().validateRequiredProperties();检验属性的合法等
1.3 this.earlyApplicationEvents = new LinkedHashSet<>();保存容器中的一些早期的事件
2.obtainFreshBeanFactory(); 获取bean工厂
2.1 this.beanFactory=new DefaultListableBeanFactory();在GenericApplicationContext的无参构造中。
2.2 this.beanFactory.setSerializationId(getId()); 设置序列化Id
2.3 getBeanFactory 返回刚才GenericApplicationContext创建的BeanFactory对象
3.prepareBeanFactory(beanFactory); beanFactory的预准备工作
3.1 设置beanFactory的类加载器、表达式解析器
3.2 添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
3.3 设置忽略的自动装配的接口
3.4 注册可以解析的自动装配
3.5 添加BeanPostProcessor【ApplicationListenerDetector】
4.postProcessBeanFactory(beanFactory); BeanFactory准备工作完成后的后置处理
4.1 但是这是一个空方法 代表子类可以通过重写这个方法在BeanFactory创建并预准备完成以后做进一步的设置
=======================以上是BeanFactory的创建以及预准备工作============================
5. invokeBeanFactoryPostProcessors(beanFactory); 执行beanFactoryPostProcessor
5.1 先执行实现了PriorityOrdered优先级接口的注册表后置处理器
5.2 再执行实现了ordered顺序接口的注册表后置处理器
5.3 最后执行没有实现任何优先级或者是顺序接口的注册表后置器
5.4 再执行BeanFactoryPostProcessor的方法 与上面类似
6. registerBeanPostProcessors(beanFactory); 注册Bean后置处理器
BeanPostProcessor
DestructionAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor【internaPostProcessor】
不同接口类型的BeanPostProcessor在Bean创建前后的执行时期是不一样的 后置处理器都默认可以有优先级
6.1 获取所有的BeanPostProcessor;
6.2 先注册PriorityOrdered优先级的BeanPostProcessor
把每一个BeanPostProcessor添加到BeanFactory中
beanFactory.addBeanPostProcessor
6.3 再注册实现了ordered接口的
6.4 最后注册没有实现任何优先级的BeanPostProcessor
6.5 最终注册MergedBeanDefinitionPostProcessor
6.6 注册一个ApplicationListenerDetector在Bean创建完成后检查是否是ApplicationListener 如果是 绑定
7. initMessageSource();初始化MessageSource组件(做国际化功能,消息绑定,消息解析)
7.1 获取Bean工厂
7.2 看容器是否有id为messageSource的,类型为MessageSource的组件
如果有,赋值给messageSource,如果没有自己创建一个DelegatingMessageSource
7.3 把创建好的MessageSource注册在容器中,以后可以获取国际化配置文件的值的时候,可以自动注入MessageSource
8 initApplicationEventMulticaster(); 初始化事件派发器
8.1 在bean工厂中获取applicationEventMulticaster的ApplicationEventMulticaster
8.2 如果上一步没配置;则自己创建一个simpleApplicationEventMulticaster
8.3 将创建的ApplicationEventMulticaster注册到BeanFactory中,以后其他组件自动注入
9 onRefresh();留给子容器
9.1 子类重写这个方法,在容器刷新的时候可以自定义逻辑。
10 registerListeners(); 给容器中将所有项目里面的ApplicationListener注册进来
10.1 从容器中拿到所有的ApplicationListener
10.2 将每个监听器添加到事件派发器
getApplicationEventMulticaster().addApplicationListener(listener);
10.3 派发之前步骤产生的事件
=============================================================================================
11 finishBeanFactoryInitialization(beanFactory); 实例化所有剩下的单实例bean
11.1 beanFactory.preInstantiateSingletons();
11.2 获取容器中剩下的所有Bean,依次进行初始化和实例化
11.3 For循环获取bean的定义信息
11.4 判断Bean不是抽象的,是单实例的,不是懒加载的
11.4.1 判断是否是factoryBean;是否是实现了FactoryBean接口的Bean 如果是进行FactoryBean.getObject的方法
11.4.2 如果不是FactoryBean 创建对象
0.getBean(beanName) ioc.getBean;
1.dogetBean(name,null,null,null,false)
2.先获取缓存中保存的单实例bean。如果能获取到说明这个bean之前被创建过
3.缓存中获取不到,开始bean的创建对象流程
4.标记当前bean已经被创建
5.获取bean的定义信息
6.【获取当前bean依赖的其他bean 如果有 还是按照getBean的方式把依赖的Bean先创建出来】
7.启动单实例bean的创建流程
7.1 createBean(beanName,mbd,args)
7.2 Class<?> resolvedClass = resolveBeanClass(mbd, beanName);让beanPostProcessor先提前拦截 返回代理对象
InstaintiationAwareBeanPostProcessor 提前执行
触发
7.3 如果前面的InstaintiationAwareBeanPostProcessor没有返回代理对象;
7.4 Object beanInstance = doCreateBean(beanName, mbdToUse, args); 调用此方法创建bean。
7.5 createBeanInstance(beanName, mbd, args); 创建bean实例
利用工厂方法或者对象的构造器创建出bean实例
7.6 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
调用MergedBeanDefinitionPostProcessor
=================================================================================
7.7 【populateBean(beanName, mbd, instanceWrapper);】 填充bean属性
7.8 填充bean属性之前 拿到InstantiationAwareBeanPostProcessor后置处理器 执行这些后置处理器的
postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
7.9 又在bean属性填充之前, 又拿到InstantiationAwareBeanPostProcessor后置处理器 执行这些后置处理器 的postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
7.10 最后 applyPropertyValues(beanName, mbd, bw, pvs); 为属性赋值利用setter方法等进行赋值
=================================================================================
7.11 【bean初始化】exposedObject = initializeBean(beanName, exposedObject, mbd);
【执行Aware接口方法】 执行invokeAwareMethods(beanName,bean)
【执行BeanPostProcessor后置处理器方法】
processor.postProcessBeforeInitialization(result, beanName);
【执行初始化方法】 invokeInitMethods(beanName, wrappedBean, mbd);
判断是否是InitializingBean接口的实现 如果是 执行接口规定的初始化方法
((InitializingBean) bean).afterPropertiesSet();
判断是否自定义了初始化方法 如果有 执行
invokeCustomInitMethod(beanName, bean, mbd);
【执行BeanPostProcessor的初始化之后的方法】
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
====================================================================================
7.12 初始化执行完了 注册bean的销毁方法。
registerDisposableBeanIfNecessary(beanName, bean, mbd);
7.13 将创建的bean添加到缓存中
======================================================================================
8.所有bean都利用getBean创建完成以后
检查所有Bean是否是SmartInitialzingSingleten接口的 如果是 执行
smartSingleton.afterSingletonsInstantiated();
12. this.finishRefresh(); 完成bean工厂的初始化创建工作 IOC容器创建完成
12.1 this.initLifecycleProcessor(); 寻找和生命周期有关的后置处理器【LifeCycleProcessor】
如果没有 自己创建一个 new DefaultLifeCycleProcessor
写LifeCycleProcessor的实现类,可以在BeanFactory在onRrfresh和onClose的时候进行一些调用 回调。
12.2 this.getLifecycleProcessor().onRefresh(); 回调生命周期处理器的方法
12.3 this.publishEvent((ApplicationEvent)(new ContextRefreshedEvent(this)));
发布容器刷新完成的事件
===========总结========================
1. Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;
1.1 使用Xml注册bean定义信息 <bean><bean/>
1.2 使用注解注册bean定义信息 @Bean @Component等
2. Spring容器会在合适的时机去创建bean实例
2.1 用到有些独特的bean时。利用getBean创建bean 创建好保存到容器的相关Map集合里
2.2 统一创建剩下所有Bean;---> finishBeanFactoryInitialization();
3. 后置处理器【非常重要】:
3.1 每一个bean创建完成,都会使用各种后置处理器进行扩展处理来增强bean的功能
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:做AOP功能【实现了SmartInstantiationAwareBeanPostProcessor】
AsyncAnnotationBeanPostProcessor 做异步注解的功能
4. spring事件驱动模型
ApplicationListener:事件监听器
ApplicationEventMulticaster:派发器
ApplicationEvent:事件类 举几个例子:ContextClosedEvent ContextRefreshedEvent
我们也可以自定义事件 只要实现这个接口后注入到容器中
Servlet3.0
ntMulticaster:派发器
ApplicationEvent:事件类 举几个例子:ContextClosedEvent ContextRefreshedEvent
我们也可以自定义事件 只要实现这个接口后注入到容器中
# Servlet3.0