ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

IOC容器源码分析

2021-02-03 17:02:05  阅读:197  来源: 互联网

标签:容器 beanFactory 创建 beanName Bean 初始化 bean 源码 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()

标签:容器,beanFactory,创建,beanName,Bean,初始化,bean,源码,IOC
来源: https://blog.csdn.net/qq_42890745/article/details/113614449

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有