作者:叁滴水

blog.csdn.net/qq_30285985/article/details/115433099

文章目录

  • 前言

  • 为什么会有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一一对应起来。

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

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

在定义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<T> {String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";@NullableT getObject() throws Exception;@NullableClass<?> getObjectType();default boolean isSingleton() {return true;}
}

二、通过源码深入学习FactoryBean

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

这里带领大家了解下Mybatis的MapperFactoryBean,这个是生成Mapper的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呢?

END

推荐好文

>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

Spring中 BeanFactory 与 FactoryBean 的区别相关推荐

  1. Spring中BeanFactory和FactoryBean的区别

    先介绍一下Spring的IOC容器到底是个什么东西,都说是一个控制反转的容器,将对象的控制权交给IOC容器,其实在看了源代码之后,就会发现IOC容器只是一个存储单例的一个ConcurrentHashM ...

  2. Spring源码分析-从源码看BeanFactory和FactoryBean的区别

    导语   在使用Spring 中最为核心的操作就是Bean的创建以及使用.下面就来带着大家一起来分析一下关于Spring的Bean的加载相关的知识 文章目录 BeanFactory getBean方法 ...

  3. Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?

    BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...

  4. factorybean 声明_阿里面试题:BeanFactory与FactoryBean的区别

    作者:至尊宝 来源:cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的 ...

  5. 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?

    请说明一下Spring中BeanFactory和ApplicationContext的区别是什么? BeanFactory: 是spring中比较原始,比较古老的Factory.因为比较古老,所以Be ...

  6. spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别

    spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别 ApplicationContext ac = new Class ...

  7. spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?

    问题:spring中@Inject和@Autowired的区别?分别在什么条件下使用呢? 我在浏览SpringSource上的一些博客,在其他一个博客中,那个作者用了@Inject,但是我觉得他用@A ...

  8. Spring的BeanFactory和FactoryBean

    博客迁移了.麻烦去新地址查看. Spring的BeanFactory和FactoryBean 链接地址:http://www.msyy233.com/posts/17047.html#more

  9. [读书笔记]Spring中BeanFactory和ApplicationContext的联系和区别

    写在前言 依赖反转是指依赖对象的获得被反转了.依赖控制反转的实现有很多方式,Spring中IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对 ...

最新文章

  1. [译]React Component最佳实践
  2. 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
  3. linux升级ssh到6.6版本,CentOS6.5 openssh升级到openssh-7.6版本
  4. emmet插件使用(Css)
  5. 内存占用少,计算速度快!华为诺亚方舟Lab开源即插即用的多用卷积核(NeurIPS 2018)...
  6. 1015.利用QxOrm库操作数据库示例代码
  7. Akka系列(二):Akka中的Actor系统
  8. python画3d图-Python 竟能绘制如此酷炫的三维图
  9. Word查找重复的内容
  10. 常用的JScript代码整理
  11. Android手机ram大小,什么是手机RAM内存?手机RAM内存越大越好吗?
  12. mysql chunk 函数_Laravel中的chunk组块结果集处理与注意问题
  13. 最安全的邮箱大全排名,公司安全邮箱申请如何设置?
  14. 电力系统强大的Gurobi 求解器的学习(PythonMatlab)
  15. 【2】Kubernetes集群安装
  16. 苦战金三银四:580道最全面的BATJ大厂Java面试真题分享
  17. 网上购车平台上私户,不一样的上私户购车体验
  18. 大小写转化php,怎样用PHP做出人名币大小写的方法转换
  19. 超导体的性质,不研究制备
  20. SVD计算旋转,平移矩阵

热门文章

  1. 支付宝上线AR扫识别垃圾功能,十大“拎不清”垃圾令小姐姐捂脸
  2. 开创先河!《王者荣耀国际版》成为东南亚运动会正式比赛项目
  3. 从2699降至599无人理 最惨国产机实至名归
  4. xml2 交叉编译移植
  5. shell编程中配置文件的使用
  6. Android 自定义漂亮的圆形进度条
  7. 四个程序员恋爱必学的聊天知识点!
  8. vs 警告被视为错误
  9. git 如何撤销提交
  10. 我的docker随笔20:多平台docker镜像下载