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();
			}

Spring之Ioc工作流程_第1张图片

  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

你可能感兴趣的:(spring原理学习,spring,java,后端)