Spring容器创建流程的源码分析:

因为是使用注解版进行分析所以分析的入口是AnnotationConfigApplicationContext ,如果是使用 xml ,那么入口即为 ClassPathXmlApplicationContext

public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		this();
		register(componentClasses);
		refresh();
	}

一、this()无参构造器:

(1)父类构造函数中实例化BeanFactory【DefaultListableBeanFactory】工厂

public GenericApplicationContext() {
		this.beanFactory = new DefaultListableBeanFactory();
	}

(2)实例化AnnotatedBeanDefinitionReader注解配置读取器(里面注册了创世纪的类,特别重要的一个是注册了解析配置类@Configuration的后置处理器internalConfigurationAnnotationProcessor),用于对特定注解(如@ComponentScan

、@import、@Bean等)的类进行读取转化成  BeanDefinition 对象,(BeanDefinition 是 Spring 中极其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
(3)实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象,解析配置类其实不是这个扫描器做的,但可以手动调用context.doScan来解析配置类

调用后,开天辟地类已经注册到beanDefinitionMap里面了,如图:

创建容器数据卷 如何创建容器_初始化

二、refister

将配置类(@Configuration)的beanDefinition注册到beanDefinitionMap

调用后,config配置类也进去了,如图:

创建容器数据卷 如何创建容器_创建容器数据卷_02

 

三、refresh()

@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);
				beanPostProcess.end();

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

1、prepareRefresh()刷新前的预处理:

(1)initPropertySources():初始化一些属性设置,空方法,提供给子类自定义;
(2)getEnvironment().validateRequiredProperties():检验属性的合法性
(3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>():保存容器中的一些早期的事件;

 

2、obtainFreshBeanFactory():获取在容器初始化时创建的BeanFactory:

(1)refreshBeanFactory():刷新BeanFactory,设置序列化ID【org.springframework.context.support.GenericApplicationContext#refreshBeanFactory】
(2)getBeanFactory():返回初始化(this();调用)时创建的BeanFactory(DefaultListableBeanFactory)对象【org.springframework.context.support.GenericApplicationContext】

 

3、prepareBeanFactory(beanFactory):BeanFactory的预处理工作,向容器中添加一些组件:

(1)设置BeanFactory的类加载器、设置表达式解析器等等
(2)添加BeanPostProcessor【ApplicationContextAwareProcessor】
(3)设置忽略自动装配的接口:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware;
(4)注册可以解析的自动装配类,即可以在任意组件中通过注解自动注入:BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
(5)添加BeanPostProcessor【ApplicationListenerDetector】
(6)添加编译时的AspectJ;
(7)给BeanFactory中注册的3个组件:environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】

4、postProcessBeanFactory(beanFactory):子类重写该方法,可以实现在BeanFactory创建并预处理完成以后做进一步的设置

 

5、invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器,用来定制和修改BeanFactory的内容(bean定义信息),如覆盖或添加属性,这时所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建

(1)先执行BeanDefinitionRegistryPostProcessor: postProcessor.postProcessBeanDefinitionRegistry(registry)

① 获取所有的实现了BeanDefinitionRegistryPostProcessor接口类型的集合
② 先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor

创建容器数据卷 如何创建容器_Source_03


③ 再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor

④ 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors        

创建容器数据卷 如何创建容器_Source_04

总结:第一次调用,因为容器中已经只有 org.springframework.context.annotation.internalConfigurationAnnotationProcessor (实际上是ConfigurationClassPostProcessor)这个BeanDefinitionRegistryPostProcessors的实现,所以他会先调用ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法去注册容器中的配置类,注册的时候会去调用parse方法是获取配置类的中注解信息,然后loadBeanDefinitions方法会把这些注解信息注册到容器。
然后第二和第三次就是来执行你自己注册的BeanDefinitionRegistryPostProcessors接口,只要你实现了,他就会去调用。这其实是为了让使用者去介入到spring容器生命周期的接口。

(2)再执行BeanFactoryPostProcessor的方法:postProcessor.postProcessBeanFactory(beanFactory)

① 获取所有的实现了BeanFactoryPostProcessor接口类型的集合
② 先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor
③ 再执行实现了Ordered顺序接口的BeanFactoryPostProcessor
④ 最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor

6、registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,bean创建对象初始化前后进行拦截工作的,从而完成代理、自动注入、循环依赖等功能

(1)获取所有实现了BeanPostProcessor接口类型的集合:
(2)先注册实现了PriorityOrdered优先级接口的BeanPostProcessor;
(3)再注册实现了Ordered优先级接口的BeanPostProcessor;
(4)最后注册没有实现任何优先级接口的BeanPostProcessor;
(5)给容器注册一个ApplicationListenerDetector:用于在Bean创建完成后检查是否是ApplicationListener,如果是,就把Bean放到容器中保存起来:applicationContext.addApplicationListener((ApplicationListener<?>) bean);

此时容器中默认有6个默认的BeanProcessor(无任何代理模式下):【ApplicationContextAwareProcessor】、【ConfigurationClassPostProcessorsAwareBeanPostProcessor】、【PostProcessorRegistrationDelegate】、【CommonAnnotationBeanPostProcessor】、【AutowiredAnnotationBeanPostProcessor】、【ApplicationListenerDetector】
下图中的3是我自定义的BeanProcessor

创建容器数据卷 如何创建容器_优先级_05

 

7、initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:

(1)看BeanFactory容器中是否有id为messageSource 并且类型是MessageSource的组件:如果有,直接赋值给messageSource;如果没有,则创建一个DelegatingMessageSource;
(2)把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource;

8、initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到:

(1)看BeanFactory容器中是否存在自定义的ApplicationEventMulticaster:如果有,直接从容器中获取;如果没有,则创建一个SimpleApplicationEventMulticaster
(2)将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件就可以直接自动注入

9、onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑

 

10、registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,并派发之前步骤产生的事件:

 (1)从容器中拿到所有的ApplicationListener
(2)将每个监听器添加到事件派发器中:getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
(3)派发之前步骤产生的事件applicationEvents:getApplicationEventMulticaster().multicastEvent(earlyEvent);

11、finishBeanFactoryInitialization:bean的生成

对于bean的生命周期会新开一片文章来详细记录。