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实例的创建(一)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)