springIOC容器创建源码分析

spring容器初始化过程
	1、通过newAnnotationConfigApplicationContext构造方法传入加了@Configuration的配置类
	AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
	
	2、AnnotationConfigApplicationContext构造方法主要有3个方法,spring容器的初始化就在这3行代码里
		
		// 这里由于他有父类,故而会先调用父类(GenericApplicationContext)的构造方法,
		// GenericApplicationContext主要是实例化一个beanFactory工厂
		// 然后才会调用自己的构造方法
		// 在自己的构造方法中初始一个读取器和扫描器
		this();
			// AnnotationConfigApplicationContext继承了GenericApplicationContext类,所以会先去初始化GenericApplicationContext的构造方法
			// GenericApplicationContext类主要实例化了一个beanFactroy工厂
			1) GenericApplicationContext#GenericApplicationContext() {
					// 这个beanFactory类型为DefaultListableBeanFactory beanFactory
					// 需要看DefaultListableBeanFactory的继承关系
					// DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory --> extends AbstractBeanFactory
					// 在AbstractBeanFactoty抽象类中初始化beanFactory所需的各种原料如:
					// List beanPostProcessors,后置处理器
					// Map scopes,
					// Map mergedBeanDefinitions,bean的配置信息等
					// 此时beanFactory已经准备完成
					this.beanFactory = new DefaultListableBeanFactory();
				}
			
			// 紧接着走AnnotationConfigApplicationContext自己的构造方法
			2) AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() {
					// 创建一个读取加了注解的Bean的定义,Bean的定义就是BeanDefinition类
					// 这个类就是spring对bean的描述
					this.reader = new AnnotatedBeanDefinitionReader(this);
						--> 跟到AnnotationConfigUtils#registerAnnotationConfigProcessors();
							---> 这里主要是向beanFactory工厂设置所需的各种原料,会向beanFactory工厂注册5个配置
								----> org.springframework.context.annotation.internalConfigurationAnnotationProcessor	这个是最重要的
								----> org.springframework.context.annotation.internalAutowiredAnnotationProcessor
								----> org.springframework.context.annotation.internalCommonAnnotationProcessor
								----> org.springframework.context.event.internalEventListenerProcessor
								----> org.springframework.context.event.internalEventListenerFactory
							---> 跟到DefalutListableBeanFactory#registerBeanDefinition();
								到这个方法之后会向beanFactory工厂注册上面5个配置放到DefalutListableBeanFactory的beanDefinitionMap属性中
								至此,spring本身需要的配置注册完成

					// 在IOC容器中初始化一个 按类路径扫描注解bean的 扫描器
					this.scanner = new ClassPathBeanDefinitionScanner(this);
					// 这里的scanner没有实质性的作用,spring在reader中会自己new一个ClassPathBeanDefinitionScanner()对象
				}
		
		/**
		 * register方法重点完成了bean配置类本身的解析和注册,处理过程可以分为以下几个步骤:
		 * 	 1.根据bean配置类,使用BeanDefinition解析Bean的定义信息,主要是一些注解信息
		 * 	 2.Bean作用域的处理,默认缺少@Scope注解,解析成单例
		 * 	 3.借助AnnotationConfigUtils工具类解析通用注解
		 * 	 4.将bean定义信息已beanname,beandifine键值对的形式注册到ioc容器中
		 */
		register(annotatedClasses);
			--> 代码最终跟到AnnotatedBeanDefinitionReader#doRegisterBean()方法
				---> 首先创建一个注解元数据的数据结构类AnnotatedGenericBeanDefinition里面含有配置文件的一下元信息如beanClass,scope,lazyInit,primary...
				---> 将填充好的AnnotatedGenericBeanDefinition元数据注册给registry,这个refistry就是AnnotationConfigApplicationContext
			--> 跟到BeanDefinitionReaderUtils.registerBeanDefinition()方法的
				registry.registerBeanDefinition(),这里会向beanFactory工厂注册自己的配置类AppConfig此时beanFactory工厂会有6个配置
					---> org.springframework.context.annotation.internalConfigurationAnnotationProcessor	这个是最重要的
					---> org.springframework.context.annotation.internalAutowiredAnnotationProcessor
					---> org.springframework.context.annotation.internalCommonAnnotationProcessor
					---> org.springframework.context.event.internalEventListenerProcessor
					---> org.springframework.context.event.internalEventListenerFactory
					---> appConfig	这个是自己的配置类
		
		/**
		 * 刷新上下文
		 */
		refresh();
			1) AbstractApplicationContext#refresh()		// 这个方法会对beanFactory进行初始化
				// 1.刷新前的预处理,不重要
				prepareRefresh();	
				
				// 2.获取刷新后的内部Bean工厂,设置一个serializationId
				ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
				
				//3.BeanFactory的预准备工作(重点)
				prepareBeanFactory(beanFactory);
					//配置其标准特征,比如上下文的加载器ClassLoader和post-processors回调,这里看源码
					--> 跟进去到AbstractApplicationContext#prepareBeanFactory();	
				
				// 4.空方法,用于在容器的子类中扩展
				postProcessBeanFactory(beanFactory);
				
				// 在BeanFactory标准初始化之后执行的
				// 调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法
				// 5. 执行BeanFactoryPostProcessor的方法,BeanFactory的后置处理器,
				//======================================
				//-----------------重点------------------
				//======================================
				invokeBeanFactoryPostProcessors(beanFactory);
					--> AbstractApplicationContext#refresh#invokeBeanFactoryPostProcessors()
							 // 这个类需要好好看看,暂时还是很了解
						---> PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
				
				// 注册 BeanPostProcessor 的实现类,注意看和 BeanFactoryPostProcessor 的区别
				// 此接口两个方法: postProcessBeforeInitialization 和 postProcessAfterInitialization
				// 两个方法分别在 Bean 初始化之前和初始化之后得到执行。注意,到这里 Bean 还没初始化
				// 6. 注册BeanPostProcessor(Bean的后置处理器),用于拦截bean创建过程
				registerBeanPostProcessors(beanFactory);
				
				// 7. 初始化MessageSource组件(做国际化功能;消息绑定,消息解析)
				initMessageSource();
				
				// 8. 初始化事件派发器
				initApplicationEventMulticaster();
				
				// 9.空方法,可以用于子类实现在容器刷新时自定义逻辑
				onRefresh();
				
				// 10. 注册时间监听器,将所有项目里面的ApplicationListener注册到容器中来
				registerListeners();
				
				// 重点,重点,重点
				// 初始化所有的 singleton beans
				//(lazy-init 的除外)
				// 11. 初始化所有剩下的单实例bean,单例bean在初始化容器时创建,
				// 原型bean在获取时(getbean)时创建
				//======================================
				//-----------------重点------------------
				//======================================
				finishBeanFactoryInitialization(beanFactory);
				
				// 12. 完成BeanFactory的初始化创建工作,IOC容器就创建完成;
				finishRefresh();

 

你可能感兴趣的:(springIOC容器创建源码分析)