Spring IOC 容器的创建过程

Spring的创建主要是在refresh()方法内实现

1,prepareRefresh();

	刷新前预处理
	1),initPropertySources();
			初始化一些属性设置,子类自定义个性化的属性设置方法
	2),getEnvironment().validateRequiredProperties();
			检验属性的合法等功能
	3),this.earlyApplicationEvents = new LinkedHashSet<>();
			保存容器中一些早期的事件

2,obtainFreshBeanFactory();

	获取BeanFactory
	1),刷新 BeanFactory --> refreshBeanFactory();
		创建了一个this.beanFactory = new DefaultListableBeanFactory();
		设置id
	2),getBeanFactory();返回刚才 GenericApplicationContext 创建的 BeanFactory 对象
	3),将创建的BeanFactory【DefaultListableBeanFactory】返回

3,prepareBeanFactory(beanFactory);

	BeanFactory 的预准备工作(BeanFactory进行一些设置)
	
	1),设置 BeanFactory 的类加载器,支持表达式解析器...
	2),添加部分的 BeanPostProcessor【ApplicationContextAwareProcessor】
	3),设置忽略的自动装配的接口 
		EnvironmentAware,
		EmbeddedValueResolverAware,
		ResourceLoaderAware,
		ApplicationEventPublisherAware,
		MessageSourceAware,
		ApplicationContextAware
	4),注册可以解析的自动装配registerResolvableDependency(BeanFactory.class, beanFactory);
		我们能直接在任何组件中自动注入:
		BeanFactory,
		ResourceLoader,
		ApplicationEventPublisher,
		ApplicationContext
	5),添加 BeanPostProcesso r【ApplicationListenerDetector】
	6),添加编译时的Aspectj
	7),给BeanFactory中注册一些能用的组件:
		environment【ConfigurableEnvironment】,
		systemProperties【Map<String, Object>】,
		systemEnvironment【Map<String, Object>】

4,postProcessBeanFactory(beanFactory);

	BeanFactory 准备工作完成后进行的后置处理工作
	子类通过重写postProcessBeanFactory()方法,来在 BeanFactory 创建并预准备完成以后做进一步的设置

以上是 BeanFactory 的创建以及预准备工作

5),invokeBeanFactoryPostProcessors(beanFactory);

	执行所有的BeanFactoryPostProcessor的方法
	BeanFactoryPostProcessor:BeanFactory 的后置处理器,在BeanFactory标准初始化之后(前四步)执行的
	两个接口:BeanFactoryPostProcessor--->BeanDefinitionRegistryPostProcessor
	【执行 BeanFactoryPostProcessor 的方法】
		先执行 BeanDefinitionRegistryPostProcessor 的方法
		1),获取所有的 BeanDefinitionRegistryPostProcessor
		2),先执行实现了 PriorityOrdered 优先级接口的 BeanDefinitionRegistryPostProcessor
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		3),再执行实现了 Ordered 顺序接口的 BeanDefinitionRegistryPostProcessor
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		4),最后执行没有实现任何优先级接口的或者是顺序接口的 BeanDefinitionRegistryPostProcessor
			postProcessor.postProcessBeanDefinitionRegistry(registry);
		
		再执行BeanFactoryPostProcessor的方法
		1),获取所有的 BeanFactoryPostProcessor
		2),先执行实现了 PriorityOrdered 优先级接口的 BeanFactoryPostProcessor
			postProcessor.postProcessBeanFactory(beanFactory);
		3),再执行实现了 Ordered 顺序接口的 BeanFactoryPostProcessor
			postProcessor.postProcessBeanFactory(beanFactory);
		4),最后执行没有实现任何优先级接口的或者是顺序接口的 BeanFactoryPostProcessor
			postProcessor.postProcessBeanFactory(beanFactory);

6),registerBeanPostProcessors(beanFactory);

	注册BeanPostProcessor	(bean的后置处理器)【拦截整个Bean的创建过程】	
	不同接口类型的 BeanPostProcessor,在Bean创建前后执行时机是不一样的
	BeanPostProcessor(BeanPostProcessor 及其子接口)
	-->DestructionAwareBeanPostProcessor 容器销毁的 Processor
	-->InstantiationAwareBeanPostProcessor
		-->SmartInstantiationAwareBeanPostProcessor
	-->MergedBeanDefinitionPostProcessor【internalPostProcessors存放】
	
	1),获取所有的 BeanPostProcessor;后置处理器都默认可以通过 PriorityOrdered,Ordered 接口指定优先级
	2),先注册PriorityOrdered接口的BeanPostProcessor;
		把每一个BeanPostProcessor添加到BeanFactory中
		beanFactory.addBeanPostProcessor(postProcessor);
	3),再注册Ordered接口的
	4),最后注册没有实现任何优先级接口的BeanPostProcessor
	5),最终注册MergedBeanDefinitionPostProcessor接口的BeanPostProcessor
	6),再注册一个ApplicationListenerDetector,来在Bean创建完成后检查是否是ApplicationListener,
		如果是:applicationContext.addApplicationListener((ApplicationListener<?>) bean);

7),initMessageSource();

	初始化MessageSource组件(做国际化功能,消息绑定,消息解析);
	1),获取BeanFactory
	2),看容器中是否有id为messageSource,类型为MessageSource的组件
		如果有,从BeanFactory获取到并赋值给messageSource属性
		如果没有就自己创建一个DelegatingMessageSource;new DelegatingMessageSource();
			MessageSource:取出国际化配置文件中的某个key的值,能按照区域信息获取
	3),把创建好的MessageSource注册在容器中,以后获取国际化配置文件中的值的时候,可以自动注入MessageSource
		beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
		MessageSource.getMessage(String code, Object[] args, String defaultMessage, Locale locale);

8),initApplicationEventMulticaster();

	初始化事件派发器
	1),获取BeanFactory
	2),从BeanFactory中获取id=“applicationEventMulticaster”的ApplicationEventMulticaster类型的组件,并赋值给
		applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
	3),如果上一步没有配置,就自己创建一个如果没有,就自己创建一个
		applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
		并且将创建的ApplicationEventMulticaster注册到BeanFactory中,以后其他组件可以直接自动注入获取到该组件

9),onRefresh();

	初始化其他的Bean,留给子容器(子类)
	1),子类重写这个方法,在容器中刷新的时候可以自定义逻辑

10),registerListeners();

	给容器中将所有项目里面的ApplicationListener注册进来
	1),从容器中拿到所有的ApplicationListener
	2),将每个监听器添加到事件派发器中:
		getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
	3),派发之前步骤产生的事件

11),finishBeanFactoryInitialization(beanFactory);

	初始化所有剩下的单实例Bean
	1),beanFactory.preInstantiateSingletons();初始化剩下的单实例Bean
		1),获取容器中的所有Bean,依次进行初始化和创建对象
		2),获取Bean的定义信息 RootBeanDefinition
		3),如果Bean不是抽象的,是单实例的,是懒加载的
			1),判断是否是FactoryBean:是否是实现FactoryBean接口的Bean
			2),不是工厂Bean,利用getBean(beanName);创建对象
				0),getBean(beanName):ioc.getBean(beanName);
				1),doGetBean(name, null, null, false);
				2),先获取缓存中保存的单实例Bean,如果能获取到,说明这个Bean之前被创建过了(所有创建过的单实例Bean都会被缓存起来)
					从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);获取
					singletonObjects(缓存单实例Bean的容器)
				3),缓存中获取不到,开始Bean的创建对象流程:
				4),标记当前Bean已经被创建markBeanAsCreated(beanName);
				5),获取Bean定义信息getMergedLocalBeanDefinition(beanName);
				6),【从Bean定义信息中获取当前Bean依赖的其他Bean  getDependsOn();
					如果有,按照第0步的getBean()的方式,先把依赖的Bean创建出来】
				7),启动单实例Bean的创建流程:
					1),createBean(beanName, mbd, args);
					2),Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;
						【InstantiationAwareBeanPostProcessor】提前执行
						先触发postProcessBeforeInstantiation(beanClass, beanName);
						如果有返回值,再触发applyBeanPostProcessorsAfterInitialization(bean, beanName);
					3),如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象,进行下一步
					4),Object beanInstance = doCreateBean(beanName, mbdToUse, args);
						1),createBeanInstance(beanName, mbd, args);创建Bean实例
							利用工厂方法或者对象的构造器创建出Bean实例
						2),applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
							调用MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(mbd, beanType, beanName);
						3),populateBean(beanName, mbd, instanceWrapper);【Bean属性赋值】
							赋值之前:
							1),拿到InstantiationAwareBeanPostProcessor后置处理器
								执行postProcessAfterInstantiation()方法
							2),再次拿到InstantiationAwareBeanPostProcessor后置处理器
								执行postProcessProperties();方法
								
							赋值前后
							
							3),applyPropertyValues(beanName, mbd, bw, pvs);应用Bean属性的值,为属性利用setter等方法赋值
						4),initializeBean(beanName, exposedObject, mbd);【Bean初始化】
							1),invokeAwareMethods(beanName, bean);执行XXXAware接口的方法
								BeanNameAware/BeanClassLoaderAware/BeanFactoryAware
							2),applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);【执行后置处理器初始化之前的方法】
								BeanPostProcessor.postProcessBeforeInitialization();
							3),invokeInitMethods(beanName, wrappedBean, mbd);【执行初始化方法】
								1),是否是InitializingBean接口的实现,如果是执行接口规定的初始化方法
								2),执行自定义初始化方法
							4),applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);【执行后置处理器初始化之后的方法】
								BeanPostProcessor.postProcessAfterInitialization()
							5),registerDisposableBeanIfNecessary(beanName, bean, mbd);【注册Bean的销毁方法】
	
					5),addSingleton(beanName, singletonObject);【将创建的Bean添加到缓存中】
			ioc容器就是这些Map,很多的Map保存了单实例Bean和环境信息....
			3),所有Bean都利用getBean创建完成后:
				检查所有的Bean是否是SmartInitializingSingleton接口的;如果是就执行
				SmartInitializingSingleton.afterSingletonsInstantiated();

12),finishRefresh();

	完成BeanFactory的初始化创建工作,IOCr容器就创建完成
	1),clearResourceCaches();
	2),initLifecycleProcessor();【初始化和生命周期有关的后置处理器】
		默认从容器中找LifecycleProcessor组件,如果没有就用默认的生命周期组件
			new DefaultLifecycleProcessor();然后注册到容器中
		写一个LifecycleProcessor的实现类,可以在BeanFactory
			void onRefresh();
			void onClose();
	3),getLifecycleProcessor().onRefresh();【拿到前面定义的生命周期处理器,监听BeanFactory,回调onRefresh()方法】
	4),publishEvent(new ContextRefreshedEvent(this));【发布一个容器刷新完成事件】
	5),LiveBeansView.registerApplicationContext(this);

总结

1)Spring容器在启动的时候,先会保存所有注册过的Bean的定义信息;
1),xml注册Bean:
2),注解注册Bean:@Service,@Component,@Bean…
2),Spring容器会在合适的时机创建这些Bean
1),用到这个Bean的时候,利用getBean()方法创建Bean,创建好以后保存到容器中
2),统一创建剩下的所有Bean的时候finishBeanFactoryInitialization(beanFactory);
3),后置处理器:
1),每一个Bean创建完成后,都会使用各种后置处理器,来增强Bean的功能
例如:
AutowiredAnnotationBeanPostProcessor:处理自动注入
AnnotationAwareAspectJAutoProxyCreator:来做AOP功能
AsyncAnnotationBeanPostProcessor:支持异步处理的

4),Spring的事件驱动模型
ApplicationListener:事件监听
事件派发:ApplicationEventMulticaster接口

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值