Spring之Ioc工作流程

springIoc容器创建流程

在AbstractApplicationContext#refresh()中描述了创建ioc的过程

		    // 1.前期准备校验参数等
			prepareRefresh();

			// 2.创建beanFactory工厂对象,还把配置文件中的bean转换成
			// BeanDefiniton 注册到 BeanDefinitonRegistry中
			// 这时还没实例化
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// 3.对工厂对象进行优化配置
			prepareBeanFactory(beanFactory);

			try {
				// 4.空方法留给子类实现
				postProcessBeanFactory(beanFactory);

				// 5.调用工厂后处理器
				// 从BeanDefinitonRegistry中找到实现了BeanFactoryPostProcessor的并执行其中的postProcessBeanFactory方法。可以对BeanDefiniton进行修改
				invokeBeanFactoryPostProcessors(beanFactory);

				// 6.注册bean后置处理器
				// 从BeanDefinitonRegistry中找到实现了BeanPostProcessor接口的bean,注册到bean后置处理器的注册表中
				registerBeanPostProcessors(beanFactory);

				// 7.国际化
				initMessageSource();

				// 8.初始化广播器
				initApplicationEventMulticaster();

				// 9.空方法 子类实现
				onRefresh();

				// 10.加载监听器
				registerListeners();

				// 11.完成bean的实例化
				//初始化所有的单例bean,懒加载的除外,放入spring缓存中
				finishBeanFactoryInitialization(beanFactory);

				// 12.完成刷新并发布容器刷新事件
				// 创建上下文刷新事件,返送广播到监听器
				finishRefresh();
			}

在这里插入图片描述

  1. ResourseLoader 从存储介质加载配置文件,用Resourse来表达

  2. BeanDefinitonRegistry读取Resourse配置文件,把< bean>解析成BeanDefiniton存放在BeanDefinitonRegistry中

  3. 容器扫描BeanDefinitonRegistry中BeanDefiniton,得到实现了BeanFactoryPostProcessor接口的bean,然后调用其方法对BeanDefinitonRegistry中BeanDefiniton进行加工。主要进行
    (1) 有的bean值是占位符,在此解析后生成完整的BeanDefiniton
    (2) 从BeanDefinitonRegistry中扫描实属性编辑器的bean(实现了PropertyEditor接口的bean)并自动将他们注册到spring的PropertyEditorRegistry中

  4. 取出BeanDefinitonRegistry中的BeanDefiniton并调用InstantionStrategy着手实例化

  5. 在实例化时,Spring容器使用BeanWrapper对Bean进行封装,里面提供了很多java反射操作bean的方法,结合BeanDefiniton以及容器中的属性编辑器完成注入工作

  6. 利用容器中注册的Bean后置处理器(实现了BeanPostProcessor接口的Bean)对已经完成了属性设置的bean进行后置加工,直接装配出准备就绪的bean

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值