关于java:Spring-为什么会有-FactoryBean

7次阅读

共计 2270 个字符,预计需要花费 6 分钟才能阅读完成。

作者:叁滴水 \
博客:https://blog.csdn.net/qq_3028…

前言

常说 spring 的外围是 ioc,ioc 的外围是 BeanFactory。然而在 spring 中还有一个很容易让人混同的词 FactoryBean。

本文通过一些 mybatis 源码来讲述其区别,请大家参考。另外,关注公众号 Java 技术栈,在后盾回复:面试,能够获取我整顿的 Java、Spring 系列面试题和答案,十分齐全。

一、为什么会有 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。

这样一想能够认为是所有的 mapper 就是鸟,然而不晓得它是什么鸟,或者这个鸟是做什么的 (不晓得每个mapper 的性能),在真正创立它的时候,才去关注它具体的内容。

这样 FactoryBean 的就有了其意义,它能够定义出一种类型的 Bean, 并且在创立的时候再去实现其具体的性能。

外面有三个办法:

  • getObject 获取 bean 办法,在此办法中,咱们能够本人定义一个对象,而后自行批改其创立过程。通过这个办法,咱们能够在 mapper 创立的时候再实现其具体的性能。
  • getObjectType 获取这类的类型。
  • isSingleton 是否单例。
public interface FactoryBean<T> {
    
    String OBJECT_TYPE_ATTRIBUTE = "factoryBeanObjectType";

    @Nullable
    T getObject() throws Exception;

    @Nullable
    Class<?> getObjectType();

    default boolean isSingleton() {return true;}
    
}

二、通过源码深刻学习 FactoryBean

如果还没有了解 FactoryBean,咱们能够通过学习mybatis 源码,来更加深刻的理解 FactoryBean。

这里率领大家理解下 MybatisMapperFactoryBean,这个是生成 MapperFactoryBean

大家能够自行关上源码查看,通过上图的流程即可发现,每一个 mapper 是通过 MapperFactoryBeangetObject办法进行创立,最初生成一个代理类。

置信跟一下 mybatis 的源码之后,对 FactoryBean 会有更加深刻的了解。

尽管在开发时用 FactoryBean 的机会并不多,然而源码中会常常遇到,例如 spring cloudfeign组件,外面必定也会看到 FactoryBean 的身影。

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

  • 存在一种类型的 bean。mybatisMapper,feignFeignClient
  • 这种 bean 性能繁多。mapper只跟数据库做交互。FeignClient只是接口调用。

还有咱们罕用的定时器框架 quartz 框架,外面也有 JobDetailFactoryBean,Redis 中有 RedisClientFactoryBean,security 框架的 UserDetailsManagerResourceFactoryBean。

其实他们都是有一个独特的特点,就是生产的 bean 是一种类型,在创立的过程中在实现其性能。

到这是不是曾经了解了 FactoryBean 呢?

本文来自作者「叁滴水」投稿,谢谢分享,也欢送喜好技术分享的各位技术敌人向「Java 技术栈」投稿,让更多人看到,投稿形式:关注公众号「Java 技术栈」在后盾回复:投稿。

近期热文举荐:

1.600+ 道 Java 面试题及答案整顿(2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0