Spring中BeanFactory与FactoryBean的区别是什么

这篇文章主要讲解了“Spring中 BeanFactory 与 FactoryBean 的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中 BeanFactory 与 FactoryBean 的区别是什么”吧!

创新互联主要从事网站建设、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务西湖,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

 

文章目录

  • 前言
  • 为什么会有FactoryBean?
  • 通过源码深入学习FactoryBean
 

前言

常说spring的核心是ioc,ioc的核心是BeanFactory。然而在spring中还有一个很容易让人混淆的词FactoryBean。本文通过一些mybatis源码来讲述其区别,请大家参考。

 

一、为什么会有FactoryBean?

BeanFactory是在学习IOC第一课的时候就遇到的。它是生产bean的工厂。在此工厂中,我们可以生产出我们想要的bean,并且通过getBean接口进行获取。

但是在通过getBean获取bean之前,我们需要事先定义这个bean涨什么样子,或者说它由哪些组件组成。定义的方式有很多,可以通过xml进行定义,或者在代码中通过注解(@Bean、@Service)进行定义。

就好比一个Controller,在最原始的xml配置bean的时候,我们需要定义它是由哪些service组成,然后一点点的配置好。xml要与Controller的service一一对应起来。

Spring中 BeanFactory 与 FactoryBean 的区别是什么  

这种方式的弊端是所有的bean都需要事先定义好,但是有时候,有的一些bean,我们只知道它大概的样子,但是无法事先定义出其具体的功能。

就好比,我们知道它是一只鸟,但是不知道是什么种类的鸟,只有在代码执行的时候,我才知道是什么种类的鸟。如此表达可能不太直观,这里可以直接联想出mybatis中的mapper。例如UserMapper。

Spring中 BeanFactory 与 FactoryBean 的区别是什么  

在定义UserMapper的时候,我们知道其最后执行的xml的sql语句。而且这样的mapper又很多,可能还会有更多的OrderMapper、GoodsMapper等等。如果每一个都一一定义的话,会非常的麻烦。但是,我们发现mapper中的功能都是与数据库交互的代码。

因此规范其写法,通过定义一些标准的写法,就可以简化其定义过程。这样便出现了@Select注解和@Update注解(还有xml的标签),这样我们只需要在注解中写入对应的sql,在代码执行时候,执行对应的sql。

(搜索公众号Java知音,回复“2021”,送你一份Java面试题宝典)

这样一想可以认为是所有的mapper就是鸟,但是不知道它是什么鸟,或者这个鸟是做什么的(不知道每个mapper的功能),在真正创建它的时候,才去关注它具体的内容。

这样FactoryBean的就有了其意义,它可以定义出一种类型的Bean,并且在创建的时候再去实现其具体的功能。里面有三个方法。

  • getObject 获取bean方法,在此方法中,我们可以自己定义一个对象,然后自行修改其创建过程。通过这个方法,我们可以在mapper创建的时候再实现其具体的功能。
  • getObjectType 获取这类的类型。
  • isSingleton 是否单例。
public interface FactoryBean {
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";

    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class getObjectType();

    default boolean isSingleton() {
        return true;
    }
}
   

二、通过源码深入学习FactoryBean

如果还没有理解FactoryBean。我们可以通过学习mybatis源码,来更加深入的了解FactoryBean。

这里带领大家了解下Mybatis的MapperFactoryBean,这个是生成Mapper的FactoryBean。

Spring中 BeanFactory 与 FactoryBean 的区别是什么  

大家可以自行打开源码查看,通过上图的流程即可发现。每一个mapper是通过MapperFactoryBean的getObject方法进行创建,最后生成一个代理类。在代理类中对Mapper对应的注解信息进行解析。

相信跟一下mybatis的源码之后,对FactoryBean会有更加深入的理解。虽然在开发时用FactoryBean的机会并不多,但是源码中会经常遇到,例如spring cloud的feign组件,里面肯定也会看到FactoryBean的身影。

对于mybatis和feign,可以很轻松的发现其共同点:

  • 存在一种类型的bean。mybatis是Mapper,feign是FeignClient。
  • 这种bean功能单一。mapper只跟数据库做交互。FeignClient只是接口调用。

还有我们常用的定时器框架quartz框架。里面也有JobDetailFactoryBean。redis中有RedisClientFactoryBean。security框架的UserDetailsManagerResourceFactoryBean。其实他们都是有一个共同的特点,就是生产的bean是一种类型,在创建的过程中在实现其功能。到这是不是已经理解了FactoryBean呢?

感谢各位的阅读,以上就是“Spring中 BeanFactory 与 FactoryBean 的区别是什么”的内容了,经过本文的学习后,相信大家对Spring中 BeanFactory 与 FactoryBean 的区别是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


当前文章:Spring中BeanFactory与FactoryBean的区别是什么
网页网址:http://myzitong.com/article/jddcph.html