Spring源码分析(六)启动过程分析

查看我的其他Spring源码分析文章

https://blog.csdn.net/caicongyang/category_2139981.html?spm=1001.2014.3001.5482

1. this() 方法

a.构建DefaultListableBeanFactory、AnnotatedBeanDefinitionReader、ClassPathBeanDefinitionScanner

b. 在构建AnnotatedBeanDefinitionReader过程中往BeanDefinitionRegistry提前注册相关的BeanFactoryProcess

源码见org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)

提前往里注册BeanDefinition:

ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
internalPersistenceAnnotationProcessor
DefaultEventListenerFactory
EventListenerMethodProcessor

2.register(componentClasses)方法

往BeanDefinitionRegistry注册配置类

3.refresh() 方法

a.prepareRefresh(): 启动时间等,设置配置信息到Environment中

b.obtainFreshBeanFactory(): 判断是否刷新容器等额

c.prepareBeanFactory(beanFactory):

提完往beanfactory里添加ApplicationContextAwareProcessor/ApplicationListenerDetector两个bean

添加resolvableDependencies:在byType进行依赖注入时,会先从这个属性中根据类型 找bean

简单理解为提前先注入这个bean;

	// BeanFactory interface not registered as resolvable type in a plain factory.
		// MessageSource registered (and found for autowiring) as a bean.
		beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
		beanFactory.registerResolvableDependency(ResourceLoader.class, this);
		beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
		beanFactory.registerResolvableDependency(ApplicationContext.class, this);

d.invokeBeanFactoryPostProcessors(beanFactory) 方法
​​​​​​

执行BeanFactoryPostProcessor,重点是前面放进去的ConfigurationClassPostProcessor这个beanFactoryPostProcessor去递归解析包含@Component @Bean @Import @ImportSource类的解析,扫描生生产所有的BeanDefinition; 

核心类是:

org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions

e.registerBeanPostProcessors(beanFactory)方法

将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去

f.initMessageSource()方法

设置ApplicationContext的MessageSource,

g.initApplicationEventMulticaster();

发布广播

h.registerListeners();

注册监听器

i.finishBeanFactoryInitialization(beanFactory);

初始化单例方法

j.finishRefresh();

发布一些生命周期的事件等等

 
 

猜你喜欢

转载自blog.csdn.net/caicongyang/article/details/122897263