当前位置: 首页 > news >正文

Spring源码------IOC容器初始化过程

前言 

IOC容器的初始化过程,我这边分为两大步

1.容器的初始化

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MyConfig.class);

​​​​​​​ 

 2.Bean的创建

Food food = annotationConfigApplicationContext.getBean("food", Food.class);

​​​​​​​ 

1.容器的初始化

1.1初始化DefaultListableBeanFactory

AnnotationConfigApplicationContext继承GenericApplicationContext,所以在初始化AnnotationConfigApplicationContext的时候,会先调用父类GenericApplicationContext的构造函数,而 DefaultListableBeanFactory实现了BeanDefinitionRegistry,所以最终AnnotationConfigApplicationContext既是一个BeanFactory,也是一个BeanDefinitionRegistry

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

1.2初始化reader

this.reader = new AnnotatedBeanDefinitionReader(this);

该方法最主要的作用就是注册内置的五个BeanDefinition到BeanDefinitionMap中,重点关注前两个

ConfigurationClassPostProcessor[实现BeanDefinitionRegistryPostProcessor]
AutowiredAnnotationBeanPostProcessor[实现BeanPostProcessor]
CommonAnnotationBeanPostProcessor[实现BeanPostProcessor]
EventListenerMethodProcessor[实现BeanFactoryPostProcessor]
DefaultEventListenerFactory
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
			BeanDefinitionRegistry registry, @Nullable Object source) {

		DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
		if (beanFactory != null) {
			if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
				beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
			}
			if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
				beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
			}
		}

		Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);

		if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
		if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
		if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition();
			try {
				def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
						AnnotationConfigUtils.class.getClassLoader()));
			}
			catch (ClassNotFoundException ex) {
				throw new IllegalStateException(
						"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
			}
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
		}

		if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
			RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
			def.setSource(source);
			beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
		}

		return beanDefs;
	}

1.3初始化scanner

该scanner只有显式调用才会用到,不重要

annotationConfigApplicationContext.scan("com.lyf.study");

1.4注册传入的配置类MyConfig

public void register(Class<?>... componentClasses) {
		for (Class<?> componentClass : componentClasses) {
			registerBean(componentClass);
		}
	}

最终会到AnnotatedBeanDefinitionReader中的doRegisterBean方法中

关键步骤如下:

1.4.1解析@Conditional注解,判断配置类是否满足加载条件,不满足则直接跳过

if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
	return;
}

1.4.2将配置类注册到BeanDefinitionMap中

BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

1.5执行refresh的invokeBeanFactoryPostProcessor

1.5.1执行手动添加的BeanDefinitionRegistryPostProcessor

 若手动注册为BeanDefinitionRegistryPostProcessor,则先执行其postProcessBeanDefinitionRegistry方法

注:BeanFactoryPostProcessor是BeanDefinitionRegistryPostProcessor的父类

BeanFactoryPostProcessor

有postProcessBeanFactory方法,主要用于修改BeanDefinitionMap中的BeanDefinition

BeanDefinitionRegistryPostProcessor

有postProcessBeanDefinitionRegistry方法,主要用于添加BeanDefinition到BeanDefinitionMap中

//beanFactoryPostProcessors中的所有postProcessor都是显式调用annotationConfigApplicationContext.addBeanFactoryPostProcessor(null);来的
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
				if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
					BeanDefinitionRegistryPostProcessor registryProcessor =
							(BeanDefinitionRegistryPostProcessor) postProcessor;
					registryProcessor.postProcessBeanDefinitionRegistry(registry);
					registryProcessors.add(registryProcessor);
				}
				else {
					regularPostProcessors.add(postProcessor);
				}
			}

1.5.2 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor(关键)

			String[] postProcessorNames =
					beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();

这里默认情况下只会获取到reader中注册的5个内置的BeanFactoryPostProcessor中的ConfigurationClassPostProcessor,然后执行ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法​​​​​​​ 

ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry非常的关键,它主要做了一下几件事:

(1)从beanFactory中获取所有已经注册到BeanDefinitionMap中的BeanDefinitionNames

(2)给使用了@Configuration注解的BeanDefinition打上full的标识[后续会使用cglib增强],给使用了@Order注解的BeanDefinition打上优先等级

(3)将符合(2)的所有BeanDefinition放入configCandidates列表中

(4)对configCandidates列表中的BeanDefinition,依据order属性值排序,值越小,优先级越高

(5)构建ConfigurationClassParser,解析每一个使用@Configuration的类,内部会对@Component、@PropertySource、@ComponentScan、@Import、@ImportResource、@Bean注解做处理

(6)将解析出来的对象转成BeanDefintion注册到BeanDefinitionMap中

1.5.3 执行实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor

postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
			for (String ppName : postProcessorNames) {
				if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
					currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
					processedBeans.add(ppName);
				}
			}
			sortPostProcessors(currentRegistryProcessors, beanFactory);
			registryProcessors.addAll(currentRegistryProcessors);
			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
			currentRegistryProcessors.clear();

1.5.4执行剩下的BeanDefinitionRegistryPostProcessor

// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
			boolean reiterate = true;
			while (reiterate) {
				reiterate = false;
				postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
				for (String ppName : postProcessorNames) {
					if (!processedBeans.contains(ppName)) {
						currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
						processedBeans.add(ppName);
						reiterate = true;
					}
				}
				sortPostProcessors(currentRegistryProcessors, beanFactory);
				registryProcessors.addAll(currentRegistryProcessors);
				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
				currentRegistryProcessors.clear();
			}

1.5.5执行所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory

			// Now, invoke the postProcessBeanFactory callback of all processors handled so far.
			invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
			invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);

1.5.6执行所有BeanFactoryPostProcessor的postProcessBeanFactory

String[] postProcessorNames =
				beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);

		// Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
		// Ordered, and the rest.
		List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
		List<String> orderedPostProcessorNames = new ArrayList<>();
		List<String> nonOrderedPostProcessorNames = new ArrayList<>();
		for (String ppName : postProcessorNames) {
			if (processedBeans.contains(ppName)) {
				// skip - already processed in first phase above
			}
			else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
				priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
			}
			else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
				orderedPostProcessorNames.add(ppName);
			}
			else {
				nonOrderedPostProcessorNames.add(ppName);
			}
		}

		// First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
		sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);

		// Next, invoke the BeanFactoryPostProcessors that implement Ordered.
		List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
		for (String postProcessorName : orderedPostProcessorNames) {
			orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		sortPostProcessors(orderedPostProcessors, beanFactory);
		invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);

		// Finally, invoke all other BeanFactoryPostProcessors.
		List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
		for (String postProcessorName : nonOrderedPostProcessorNames) {
			nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
		}
		invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);

		// Clear cached merged bean definitions since the post-processors might have
		// modified the original metadata, e.g. replacing placeholders in values...
		beanFactory.clearMetadataCache();

1.6执行refresh的registerBeanPostProcessors方法

依据内置的AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor对应的BeanDefinition,生成相对应的Bean,并添加到容器中

  • BeanDefinitionRegistryPostProcessor

        最先执行,主要用于添加BeanDefinition

  • BeanFactoryPostProcessor

        次要执行,主要用于修改BeanDefinition

  • BeanPostProcessor

        最后执行,在Bean初始化前会调用postProcessBeforeInitialization,在Bean初始化之后会                    调用postProcessAfterInitialization

至此,容器大致的初始化过程结束.

2.Bean的创建

相关文章:

  • SpringBoot+Vue+Element-UI实现家具商城系统
  • Proxy-Reflect
  • 容器-基础
  • GC垃圾回收
  • 3D场景的制作步骤
  • 【精讲】后台项目 采用vue2框架 完整版内含详细注释 2
  • mac vscode debug安装调试moodle
  • PyTorch(一)安装与环境配置
  • 全网最牛自动化测试框架系列之pytest(7)-yield与终结函数
  • JSR303校验(1)
  • Nacos - 支持PostgreSQL
  • CFD网格质量评估标准
  • 网课答案公众号题库系统
  • 详解AVL树(二叉搜索平衡树)【C++实现】
  • 网课答案公众号搭建方法
  • Android系统模拟器绘制实现概述
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • k8s如何管理Pod
  • laravel5.5 视图共享数据
  • Octave 入门
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue2.0项目引入element-ui
  • 闭包--闭包作用之保存(一)
  • 初探 Vue 生命周期和钩子函数
  • 关于List、List?、ListObject的区别
  • 好的网址,关于.net 4.0 ,vs 2010
  • 巧用 TypeScript (一)
  • 容器服务kubernetes弹性伸缩高级用法
  • 算法-图和图算法
  • 小程序测试方案初探
  • 走向全栈之MongoDB的使用
  • 《码出高效》学习笔记与书中错误记录
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #{}和${}的区别?
  • #《AI中文版》V3 第 1 章 概述
  • #define与typedef区别
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.ajax()
  • (26)4.7 字符函数和字符串函数
  • (8)STL算法之替换
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)模仿学习-Action数据的模仿
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (状压dp)uva 10817 Headmaster's Headache
  • .apk 成为历史!
  • .describe() python_Python-Win32com-Excel
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • :“Failed to access IIS metabase”解决方法
  • @angular/cli项目构建--http(2)
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @Pointcut 使用
  • [AX]AX2012 R2 出差申请和支出报告