一位工作了4年的小伙伴,去京东面试被问到这样一个问题,Spring中的BeanFactory和FactoryBean有什么区别?因为没有看过源码,当时就感觉这是一个文字游戏,感觉没什么区别?
那今天,我就给大家来聊清楚。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在我的煮叶简介中找到。好了,我们先来看BeanFactory。
1、BeanFactory
在Spring中最核心的就是Ioc容器,它保存了所有需要对外提供的Bean的实例。Spring对外暴露的ApplicationContext作为IoC容器最重要的接口,它也实现了BeanFactory接口。
所以,BeanFactory从名字上来看,它是一个Factory,相当于是IoC容器的顶级接口,是IoC容器最基础的实现。也是提供访问Spring容器的跟接口,主要负责Bean的创建和访问。其中,最主要的一个方法就是getBean()。同时,在BeanFactory中还会完成对Bean的依赖注入,也就是DI。
2、FactoryBean
那FactoryBean呢?从名字上来看它是一个特殊的Bean,这个Bean可以返回创建Bean的工厂。如果FactoryBean接口,可以根据不同的配置类型返回不同类型的Bean,它有一个比较核心的方法叫做getObject()。
FactoryBean在使用上也有些特殊。在前面介绍的BeanFactory中,有一个常量叫做FACTORY_BEAN_PREFIX = “&”,当我们想要从Spring容器中获取创建Bean的Factory时,可以在beanName前面加上 & 符号就可以获得Bean对应的Factory。
我们也可以自定义FactoryBean,用它来扩展创建Bean的规则。在Spring中创建的AOP动态代理Bean,就是通过实现FactoryBean来实现的。我们现在用的Spring Boot、Spring Cloud也经常通过实现FactoryBean接口实现自定义组件,从而修改默认的创建Bean的规则。
3、总结
以上,就是我对BeanFactory和FactoryBean的理解,回答这个问题啊,其实只要接触过一点点的Spring源码就能讲明白。所以,在内卷这么严重的环境下,工作3年以上,就应该看看源码了,这样才能提高核心竞争力。