Spring中 BeanFactory 与 FactoryBean 的区别
作者:叁滴水
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 的区别相关推荐
- Spring中BeanFactory和FactoryBean的区别
先介绍一下Spring的IOC容器到底是个什么东西,都说是一个控制反转的容器,将对象的控制权交给IOC容器,其实在看了源代码之后,就会发现IOC容器只是一个存储单例的一个ConcurrentHashM ...
- Spring源码分析-从源码看BeanFactory和FactoryBean的区别
导语 在使用Spring 中最为核心的操作就是Bean的创建以及使用.下面就来带着大家一起来分析一下关于Spring的Bean的加载相关的知识 文章目录 BeanFactory getBean方法 ...
- Spring 的 BeanFactory 和 FactoryBean 傻傻分不清?
BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring的许多插件,如AOP ...
- factorybean 声明_阿里面试题:BeanFactory与FactoryBean的区别
作者:至尊宝 来源:cnblogs.com/aspirant/p/9082858.html BeanFacotry是spring中比较原始的Factory.如XMLBeanFactory就是一种典型的 ...
- 请说明一下Spring中BeanFactory和ApplicationContext的区别是什么?
请说明一下Spring中BeanFactory和ApplicationContext的区别是什么? BeanFactory: 是spring中比较原始,比较古老的Factory.因为比较古老,所以Be ...
- spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别
spring中ClassPathXmlApplication和FileSystemXmlApplicationContext使用区别 ApplicationContext ac = new Class ...
- spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?
问题:spring中@Inject和@Autowired的区别?分别在什么条件下使用呢? 我在浏览SpringSource上的一些博客,在其他一个博客中,那个作者用了@Inject,但是我觉得他用@A ...
- Spring的BeanFactory和FactoryBean
博客迁移了.麻烦去新地址查看. Spring的BeanFactory和FactoryBean 链接地址:http://www.msyy233.com/posts/17047.html#more
- [读书笔记]Spring中BeanFactory和ApplicationContext的联系和区别
写在前言 依赖反转是指依赖对象的获得被反转了.依赖控制反转的实现有很多方式,Spring中IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对 ...
最新文章
- [译]React Component最佳实践
- 报名 | 腾讯组织的区块链技术沙龙,本周六在深圳!
- linux升级ssh到6.6版本,CentOS6.5 openssh升级到openssh-7.6版本
- emmet插件使用(Css)
- 内存占用少,计算速度快!华为诺亚方舟Lab开源即插即用的多用卷积核(NeurIPS 2018)...
- 1015.利用QxOrm库操作数据库示例代码
- Akka系列(二):Akka中的Actor系统
- python画3d图-Python 竟能绘制如此酷炫的三维图
- Word查找重复的内容
- 常用的JScript代码整理
- Android手机ram大小,什么是手机RAM内存?手机RAM内存越大越好吗?
- mysql chunk 函数_Laravel中的chunk组块结果集处理与注意问题
- 最安全的邮箱大全排名,公司安全邮箱申请如何设置?
- 电力系统强大的Gurobi 求解器的学习(PythonMatlab)
- 【2】Kubernetes集群安装
- 苦战金三银四:580道最全面的BATJ大厂Java面试真题分享
- 网上购车平台上私户,不一样的上私户购车体验
- 大小写转化php,怎样用PHP做出人名币大小写的方法转换
- 超导体的性质,不研究制备
- SVD计算旋转,平移矩阵