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

老生谈spring(二十二):Bean实例的创建(二),第1张

老生谈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原理,下一节将讲解有参的创建逻辑。

  • 上一篇:Bean实例的创建(一)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5686380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存