老生谈spring(二十三):Bean实例的创建(二)

老生谈spring(二十三):Bean实例的创建(二)


1、如果BeanDefiniton的factoryMethodName属性不为空,则进入instantiateUsingFactoryMethod的创建逻辑。

		if (mbd.getFactoryMethodName() != null) {
			return instantiateUsingFactoryMethod(beanName, mbd, args);
		}

2、点进instantiateUsingFactoryMethod方法你会发现,主要的代码逻辑就在instantiateUsingFactoryMethod这个方法里,由于这个方法的代码非常长,所以不着急去看源码。首先给大家举个例子(去掉了Supplier属性):

//通过@Bean创建实例
@Component
public class AFactory  {
    @Bean
    public A a(){
        return new A();
    }
}

3、通过断点调试instantiateUsingFactoryMethod,可以看到factoryBeanName就是我们的AFactory这个类。(由于注解扫描方式没讲,所以先断点调试)
在这里插入图片描述
4、拿到这个factoryBeanName二话不说调用getBean的方法创建AFactory的Bean。
在这里插入图片描述

5、断点再往下走,就会看到通过mbd这个RootBeanDefinition的getResolvedFactoryMethod方法拿到factoryMethodToIntrospect属性,而factoryMethodToIntrospect的值就是我们定义的AFactory的a方法。然后再把这个方法封装成List集合(candidates),后面就是用这个List集合反射创建我们A的这个Bean。
在这里插入图片描述
6、只有一个FactoryMethod并且factory方法没有参数并且构造器也没有参数的时候,就直接使用factoryBean和uniqueCandidate的factory方法进行反射创建。
在这里插入图片描述
7、instantiate方法实际就是使用beanFactory的instantiationStrategy对象的instantiate方法反射创建对象。

在这里插入图片描述
8、这里面就更清晰了,首先设置方法为可访问(用过反射的都不陌生),然后直接反射生存result对象,返回的这个result对象就是我们要创建的Bean对象。
在这里插入图片描述
9、本节主要讲了无参FactoryMethod创建bean原理,下一节将讲解有参的创建逻辑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值