IOC容器源码分析

this();//这里会创建beanFactory
	//读取注解的Bean读取器
	//这里会加载6个默认bean的定义信息
	this.reader = new AnnotatedBeanDefinitionReader(this);
	/**
	* 创建BeanDefinition扫描器
	* 可以用来扫描包或者类,继而转换为bd
	*
	* spring默认的扫描包不是这个scanner对象
	* spring在执行工程后置处理器ConfigurationClassPostProcessor时,去扫描包时会new一个ClassPathBeanDefinitionScanner
	*
	* 这里的scanner仅仅是为了程序员可以手动调用AnnotationConfigApplicationContext对象的scan方法
	*
	*/
	this.scanner = new ClassPathBeanDefinitionScanner(this);
//Bean定义注册中心注册bean的定义信息
register(componentClasses);
refresh();
	//刷新前的预处理
	prepareRefresh();
		//初始化一些属性设置,子类自定义个性化的属性设置
		initPropertySources();
		//检验属性的合法性
		getEnvironment().validateRequiredProperties();
		//保存容器中一些早期的事件
		this.earlyApplicationEvents = new LinkedHashSet<>();
	//获取bean工厂	
	ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
		//刷新和创建bean工厂
		refreshBeanFactory();
			//AnnotationConfigApplicationContext是GenericApplicationContext的子类
			//前面的this()会创建一个this.beanFactory = new DefaultListableBeanFactory();
			//设置序列化id
			this.beanFactory.setSerializationId(getId());
		//返回GenericApplicationContext创建的BeanFactory对象
		return getBeanFactory();
	//BeanFactory的预准备工作
	prepareBeanFactory(beanFactory);
		//1.设置BeanFactory的类加载器、支持表达式解析器...
		//2.添加部分BeanPostProcessor【ApplicationContextAwareProcessor等】的实例
		//3.设置忽略的自动装配的接口EnvironmentAware、EmbeddedValueResolverAware...等
		//4.注册可以解析的自动装配:我们能注解在任何组件中自动注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
		//5.添加beanPostProcessor【ApplicationListenerDetector】的实例
		//6.添加编译时的AspectJ
		//7.给beanFactory中注册一些能用的组件
	//beanFactory准备工作完成后进行的后置处理工作
	postProcessBeanFactory(beanFactory);
		//子类通过重写postProcessBeanFactory方法来在beanFactory创建并预准备完成后来做进一步的设置
	//执行BeanFactoryPostProcessors,beanFacotry的后置处理器
	//两个接口BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor
	//执行BeanFactoryPostProcessors的方法
	//这里会解析注解以及加载bean的定义信息
	invokeBeanFactoryPostProcessors(beanFactory);
		//1.获取所有的BeanDefinitionRegistryPostProcessor
		//2.按优先级执行BeanDefinitionRegistryPostProcessors
		//3.再按优先级执行BeanFactoryPostProcessors	
	//按优先级注册BeanPostProcessor的实例,用来拦截bean的创建过程
	registerBeanPostProcessors(beanFactory);
		//不同接口类型BeanPostProcessor,在bean创建前后的执行时机是不一样的
		//BeanPostProcessor
		//DestructionAwareBeanPostProcessor
		//MergedBeanDefinitionPostProcessor:在registerBeanPostProcessors(beanFactory);中最后注册
		//InstantiationAwareBeanPostProcessor
		//SmartInstantiationAwareBeanPostProcessor
		//注册一个ApplicationListenerDetector,来在bean创建完成后检查是否是ApplicationListener,如果是则this.applicationContext.addApplicationListener((ApplicationListener<?>) bean);放到容器中
	//初始化MessageSource组件(做国际化功能、消息绑定、消息解析)
	initMessageSource();
		//获取BeanFacotry
		//看容器中是否有id为messageSource的组件,如果有则赋值给属性,如果没有则自己创建一个DelegatingMessageSource
		//MessageSource主要用于取出国际化配置文件中的某个key的值,能按照区域信息获取
		//把MessageSource注册到容器中beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);,以后可以自动注入
	//初始化事件派发器
	initApplicationEventMulticaster();
		//获取BeanFacotry
		//从BeanFacotry中获取applicationEventMulticaster的ApplicationEventMulticaster
		//如果上一步没有配置就创建一个SimpleApplicationEventMulticaster
		//注册到容器中beanFactory.registerSingleton()
	//留给子容器(子类)
	//子类重写这个方法,在容器刷新的时候可以自定义逻辑
	onRefresh();
	//把所有项目里面的ApplicationListener注册进来
	registerListeners();
		//1.从容器中拿到ApplicationListener类型的组件添加到派发器中
		//2.派发之前步骤产生的事件
	//初始化所有的剩下的单实例bean
	finishBeanFactoryInitialization(beanFactory);
		//初始化剩下的单实例bean
		beanFactory.preInstantiateSingletons();
			//1.获取容器中的所有Bean,依次进行初始化和创建对象
			//2.获取Bean的定义信息:RootBeanDefinition
			//3.Bean不是抽象的,是单实例的,不是懒加载的
				//是否是factoryBean,即是否是实现FactoryBean定义接口的bean
				//不是factoryBean,利用getBean(beanName)创建对象
			//getBean(beanName)
			//doGetBean(name, null, null, false)
			//先从缓存中获取Bean,如果能获取到,说明之前已经被创建过(所有创建过的单实例Bean都会被缓存起来)
			//缓存中获取不到,后面会开始Bean的创建对象流程
			//标记当前Bean已经被创建 markBeanAsCreated(beanName);
			//获取Bean的定义信息  getMergedLocalBeanDefinition(beanName);
			//获取当前Bean依赖的其它Bean,如果有,按照getBean()把依赖的Bean先创建出来  BeanString[] dependsOn = mbd.getDependsOn();
			//启动单实例Bean的创建流程 
			createBean(beanName, mbd, args);
				//让BeanPostProcessro【InstantiationAwareBeanPostProcessor】先拦截尝试返回代理对象
				Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
					//触发Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
					//如果有返回值再触发  postProcessAfterInitialization
				//如果前面没有返回代理对象,就执行下面一步创建一个对象
				Object beanInstance = doCreateBean(beanName, mbdToUse, args);
					//利用工厂方法或者对象的构造器创建出Bean实例
					instanceWrapper = createBeanInstance(beanName, mbd, args);
					//调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition
					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
					//Bean属性赋值
					populateBean(beanName, mbd, instanceWrapper);
						//赋值之前:
						//1.拿到InstantiationAwareBeanPostProcessor后置处理器执行postProcessAfterInstantiation方法
						ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
						//2.这才是真的赋值:在执行InstantiationAwareBeanPostProcessor的postProcessProperties
						ibp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName)
                        //3.应用Bean属性的值:为属性利用setter方法等进行赋值
						applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
					//bean的初始化
					initializeBean(beanName, exposedObject, mbd);	
						//1.执行XXXAware接口的方法:BeanNameAware/BeanClassLoaderAware/BeanFactoryAware
						invokeAwareMethods(beanName, bean);
						//2.执行后置处理器初始化之前的操作postProcessBeforeInitialization(result, beanName)
						applyBeanPostProcessorsBeforeInitialization(bean, beanName);
						//3.这里才是真的的初始化:执行初始化方法
						invokeInitMethods(beanName, wrappedBean, mbd);	
								//(1)是否是InitializingBean接口的实现,是执行接口规定的初始化方法
								//(2)是否自定义初始化方法
						//4.执行后置处理器的applyBeanPostProcessorsAfterInitialization方法
						applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
					//注册bean的销毁方法
					registerDisposableBeanIfNecessary()
上一篇:Spring AOP 注解方式源码解析


下一篇:Spring面试相关