Spring refresh - invokeBeanFactoryPostProcessors - 解析 @Bean

博文目录


解析 @Bean 的流程

  • 从被解析的类中拿到所有被 @Bean 注解标注的方法, 添加到 ConfigurationClassParser 的 beanMethods 中

详细流程说明

ConfigurationClassPostProcessor#processConfigBeanDefinitions

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
		List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
	
	// ...

	// 开始解析配置类
	// 逐个解析配置类的 @PropertySource, @ComponentScan, @Import, @ImportResource, @Bean 方法
	// @ComponentScan 扫描 basePackages, 扫描到的组件会注册成为 BeanDefinition, 如果是配置类则递归解析
	// @Import 导入的类会分成3种,
	// 		ImportSelector 中延迟的被暂存起来, 非延迟的被递归解析,
	// 		ImportBeanDefinitionRegistrar 的被暂存起来,
	// 		都不是的会被当做配置类走配置类解析流程
	// @ImportResource 导入的 xml 也被暂存起来
	// @Bean 注解的方法也被暂存起来
	parser.parse(candidates);

	// 将上述暂存起来的都统一处理
	// 取到 parser 里面解析过的配置类
	Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());
	configClasses.removeAll(alreadyParsed);

	// Read the model and create bean definitions based on its content
	if (this.reader == null) {
		this.reader = new ConfigurationClassBeanDefinitionReader(
				registry, this.sourceExtractor, this.resourceLoader, this.environment,
				this.importBeanNameGenerator, parser.getImportRegistry());
	}

	// 用一个 reader 从被解析过的配置类中读取并注册 BeanDefinition
	// @Bean 注解的方法后续就是在这里被解析成为 BeanDefinition 并注册的
	this.reader.loadBeanDefinitions(configClasses);
	
	// ...

}

ConfigurationClassParser#doProcessConfigurationClass 解析 @Bean 部分

// Process individual @Bean methods
// 处理 @Bean 注解标注的方法
// 拿到被解析类上的 @Bean 注解的方法, 添加到 ConfigurationClass 的 beanMethods 中
Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
for (MethodMetadata methodMetadata : beanMethods) {
	configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值