栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

老生谈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实例的创建(一)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号