spring容器创建过程

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值