@Bean注释的方法在Spring中的解析过程

前言

本文使用的SpringBoot环境,默认使用的是AnnotationConfigApplicationContext上下文对象

一般我们使用@Bean一般都写在@Configuration注释的类下,Spring会帮我们将@Bean注释的方法返回的对象添加进容器中
如:

@Configuration
public class MyMapperConfig {
   

    @Bean
    public Car car(){
   
        return new Car();
    }

}

Tip

如果看过Spring源码或者已经了解扫描注解的过程可以直接看源码,下面我指出了几个位置

封装BeanMethod位置

ConfigurationClassParserdoProcessConfigurationClass() 方法。此方法将类的方法封装为BeanMethod

BeanMethod转换为BeanDefinition

ConfigurationClassBeanDefinitionReaderloadBeanDefinitionsForBeanMethod() 方法

如何搜索到@Bean注释的方法?

Spring源码一般都会从refresh方法开始调试
AbstractApplicationContext 的refresh()方法中会执行如下代码,注册BeanDefinition

  // Invoke factory processors registered as beans in the context.
  // 调用在上下文中注册为 bean 的工厂处理器
  invokeBeanFactoryPostProcessors(beanFactory);

由于context默认注入了ConfigurationClassPostProcessor 类,会进入processConfigBeanDefinitions()方法,该方法中会使用ConfigurationClassParser类的parse方法进行解析

// Parse each @Configuration class
		ConfigurationClassParser parser = new ConfigurationClassParser(
				this.metadataReaderFactory, this.problemReporter, this.environment,
				this.resourceLoader, this.componentScanBeanNameGenerator, registry);

		Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
		Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
		do {
   
			// 解析
			parser.parse(candidates);
			parser.validate();

			Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值